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

Bug fix errors #1

Merged
merged 2 commits into from
Sep 12, 2024
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
94 changes: 85 additions & 9 deletions ibm/flex/structures.go
Original file line number Diff line number Diff line change
Expand Up @@ -2532,17 +2532,42 @@ func UpdateGlobalTagsUsingCRN(oldList, newList interface{}, meta interface{}, re
}
}

_, resp, err := gtClient.DetachTag(detachTagOptions)
results, fullResponse, err := gtClient.DetachTag(detachTagOptions)
if err != nil {
return fmt.Errorf("[ERROR] Error detaching database tags %v: %s\n%s", remove, err, resp)
return fmt.Errorf("[ERROR] Error detaching database tags %v: %s\n%s", remove, err, fullResponse)
}
if results != nil {
errMap := make([]globaltaggingv1.TagResultsItem, 0)
for _, res := range results.Results {
if res.IsError != nil && *res.IsError {
errMap = append(errMap, res)
}
}
if len(errMap) > 0 {
output, _ := json.MarshalIndent(errMap, "", " ")
return fmt.Errorf("[ERROR] Error detaching tag %v: %s\n%s", remove, string(output), fullResponse)
}
}
for _, v := range remove {
delTagOptions := &globaltaggingv1.DeleteTagOptions{
TagName: PtrToString(v),
}
_, resp, err := gtClient.DeleteTag(delTagOptions)
results, fullResponse, err := gtClient.DeleteTag(delTagOptions)
if err != nil {
return fmt.Errorf("[ERROR] Error deleting database tag %v: %s\n%s", v, err, resp)
return fmt.Errorf("[ERROR] Error deleting database tag %v: %s\n%s", v, err, fullResponse)
}

if results != nil {
errMap := make([]globaltaggingv1.DeleteTagResultsItem, 0)
for _, res := range results.Results {
if res.IsError != nil && *res.IsError {
errMap = append(errMap, res)
}
}
if len(errMap) > 0 {
output, _ := json.MarshalIndent(errMap, "", " ")
return fmt.Errorf("[ERROR] Error deleting tag %s: %s\n%s", PtrToString(v), string(output), fullResponse)
}
}
}
}
Expand Down Expand Up @@ -2624,7 +2649,7 @@ func GetTagsUsingCRN(meta interface{}, resourceCRN string) (*schema.Set, error)
}

func UpdateTagsUsingCRN(oldList, newList interface{}, meta interface{}, resourceCRN string) error {
gtClient, err := meta.(conns.ClientSession).GlobalTaggingAPI()
gtClient, err := meta.(conns.ClientSession).GlobalTaggingAPIv1()
if err != nil {
return fmt.Errorf("[ERROR] Error getting global tagging client settings: %s", err)
}
Expand Down Expand Up @@ -2654,24 +2679,75 @@ func UpdateTagsUsingCRN(oldList, newList interface{}, meta interface{}, resource
add = append(add, envTags...)
}

resources := []globaltaggingv1.Resource{}
r := globaltaggingv1.Resource{ResourceID: &resourceCRN}
resources = append(resources, r)

if len(remove) > 0 {
_, err := gtClient.Tags().DetachTags(resourceCRN, remove)
detachTagOptions := &globaltaggingv1.DetachTagOptions{}
detachTagOptions.Resources = resources
detachTagOptions.TagNames = remove

results, fullResponse, err := gtClient.DetachTag(detachTagOptions)
if err != nil {
return fmt.Errorf("[ERROR] Error detaching database tags %v: %s", remove, err)
}
if results != nil {
errMap := make([]globaltaggingv1.TagResultsItem, 0)
for _, res := range results.Results {
if res.IsError != nil && *res.IsError {
errMap = append(errMap, res)
}
}
if len(errMap) > 0 {
output, _ := json.MarshalIndent(errMap, "", " ")
return fmt.Errorf("[ERROR] Error detaching tag %v: %s\n%s", remove, string(output), fullResponse)
}
}
for _, v := range remove {
_, err := gtClient.Tags().DeleteTag(v)
delTagOptions := &globaltaggingv1.DeleteTagOptions{
TagName: PtrToString(v),
}
results, fullResponse, err := gtClient.DeleteTag(delTagOptions)
if err != nil {
return fmt.Errorf("[ERROR] Error deleting database tag %v: %s", v, err)
return fmt.Errorf("[ERROR] Error deleting database tag %v: %s\n%s", v, err, fullResponse)
}

if results != nil {
errMap := make([]globaltaggingv1.DeleteTagResultsItem, 0)
for _, res := range results.Results {
if res.IsError != nil && *res.IsError {
errMap = append(errMap, res)
}
}
if len(errMap) > 0 {
output, _ := json.MarshalIndent(errMap, "", " ")
return fmt.Errorf("[ERROR] Error deleting tag %s: %s\n%s", PtrToString(v), string(output), fullResponse)
}
}
}
}

if len(add) > 0 {
_, err := gtClient.Tags().AttachTags(resourceCRN, add)
AttachTagOptions := &globaltaggingv1.AttachTagOptions{}
AttachTagOptions.Resources = resources
AttachTagOptions.TagNames = add
results, fullResponse, err := gtClient.AttachTag(AttachTagOptions)
if err != nil {
return fmt.Errorf("[ERROR] Error updating database tags %v : %s", add, err)
}
if results != nil {
errMap := make([]globaltaggingv1.TagResultsItem, 0)
for _, res := range results.Results {
if res.IsError != nil && *res.IsError {
errMap = append(errMap, res)
}
}
if len(errMap) > 0 {
output, _ := json.MarshalIndent(errMap, "", " ")
return fmt.Errorf("Error while updating tag: %s - Full response: %s", string(output), fullResponse)
}
}
}

return nil
Expand Down
105 changes: 53 additions & 52 deletions ibm/service/globaltagging/resource_ibm_resource_tag.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package globaltagging

import (
"context"
"encoding/json"
"fmt"
"log"
"os"
Expand All @@ -18,6 +19,7 @@ import (
"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"
)

const (
Expand All @@ -32,11 +34,11 @@ const (

func ResourceIBMResourceTag() *schema.Resource {
return &schema.Resource{
Create: resourceIBMResourceTagCreate,
Read: resourceIBMResourceTagRead,
Update: resourceIBMResourceTagUpdate,
Delete: resourceIBMResourceTagDelete,
Importer: &schema.ResourceImporter{},
CreateContext: resourceIBMResourceTagCreate,
ReadContext: resourceIBMResourceTagRead,
UpdateContext: resourceIBMResourceTagUpdate,
DeleteContext: resourceIBMResourceTagDelete,
Importer: &schema.ResourceImporter{},

CustomizeDiff: customdiff.Sequence(
func(_ context.Context, diff *schema.ResourceDiff, v interface{}) error {
Expand Down Expand Up @@ -125,19 +127,23 @@ func ResourceIBMResourceTagValidator() *validate.ResourceValidator {
return &ibmResourceTagValidator
}

func resourceIBMResourceTagCreate(d *schema.ResourceData, meta interface{}) error {
func resourceIBMResourceTagCreate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var rType, tType string
resources := []globaltaggingv1.Resource{}

userDetails, err := meta.(conns.ClientSession).BluemixUserDetails()
if err != nil {
return err
tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_resource_tag", "create")
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
return tfErr.GetDiag()
}
accountID := userDetails.UserAccount

gtClient, err := meta.(conns.ClientSession).GlobalTaggingAPIv1()
if err != nil {
return fmt.Errorf("[ERROR] Error getting global tagging client settings: %s", err)
tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_resource_tag", "create")
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
return tfErr.GetDiag()
}

resourceID := d.Get(resourceID).(string)
Expand Down Expand Up @@ -187,9 +193,24 @@ func resourceIBMResourceTagCreate(d *schema.ResourceData, meta interface{}) erro
}

if len(add) > 0 {
_, resp, err := gtClient.AttachTag(AttachTagOptions)
results, fullResponse, err := gtClient.AttachTagWithContext(context, AttachTagOptions)
if err != nil {
return fmt.Errorf("[ERROR] Error attaching resource tags : %v\n%s", resp, err)
tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_resource_tag", "create")
return tfErr.GetDiag()
}

// Check if there are errors on the attach internal response
if results != nil {
errMap := make([]globaltaggingv1.TagResultsItem, 0)
for _, res := range results.Results {
if res.IsError != nil && *res.IsError {
errMap = append(errMap, res)
}
}
if len(errMap) > 0 {
output, _ := json.MarshalIndent(errMap, "", " ")
return diag.FromErr(fmt.Errorf("Error while creating tag: %s - Full response: %s", string(output), fullResponse))
}
}
response, errored := flex.WaitForTagsAvailable(meta, resourceID, resourceType, tagType, news, d.Timeout(schema.TimeoutCreate))
if errored != nil {
Expand All @@ -204,15 +225,17 @@ func resourceIBMResourceTagCreate(d *schema.ResourceData, meta interface{}) erro
d.SetId(fmt.Sprintf("%s/%s", resourceID, rType))
}

return resourceIBMResourceTagRead(d, meta)
return resourceIBMResourceTagRead(context, d, meta)
}

func resourceIBMResourceTagRead(d *schema.ResourceData, meta interface{}) error {
func resourceIBMResourceTagRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var rID, rType, tType string

userDetails, err := meta.(conns.ClientSession).BluemixUserDetails()
if err != nil {
return err
tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_resource_tag", "read")
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
return tfErr.GetDiag()
}
acctID := userDetails.UserAccount

Expand All @@ -221,10 +244,12 @@ func resourceIBMResourceTagRead(d *schema.ResourceData, meta interface{}) error
} else {
parts, err := flex.VmIdParts(d.Id())
if err != nil {
return err
tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_resource_tag", "read")
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
return tfErr.GetDiag()
}
if len(parts) < 2 {
return fmt.Errorf("[ERROR] Incorrect ID %s: Id should be a combination of resourceID/resourceType", d.Id())
return diag.FromErr(fmt.Errorf("Incorrect ID %s: Id should be a combination of resourceID/resourceType", d.Id()))
}
rID = parts[0]
rType = parts[1]
Expand All @@ -240,7 +265,7 @@ func resourceIBMResourceTagRead(d *schema.ResourceData, meta interface{}) error

tagList, err := flex.GetGlobalTagsUsingSearchAPI(meta, rID, rType, tType)
if err != nil {
return fmt.Errorf("[ERROR] Error getting resource tags for: %s with error : %s", rID, err)
return diag.FromErr(fmt.Errorf("Error getting resource tags for: %s with error : %s", rID, err))
}

d.Set(resourceID, rID)
Expand All @@ -250,15 +275,17 @@ func resourceIBMResourceTagRead(d *schema.ResourceData, meta interface{}) error
return nil
}

func resourceIBMResourceTagUpdate(d *schema.ResourceData, meta interface{}) error {
func resourceIBMResourceTagUpdate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var rID, rType, tType string

if strings.HasPrefix(d.Id(), "crn:") {
rID = d.Id()
} else {
parts, err := flex.VmIdParts(d.Id())
if err != nil {
return err
tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_resource_tag", "update")
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
return tfErr.GetDiag()
}
rID = parts[0]
rType = parts[1]
Expand All @@ -272,38 +299,31 @@ func resourceIBMResourceTagUpdate(d *schema.ResourceData, meta interface{}) erro
oldList, newList := d.GetChange(tags)
err := flex.UpdateGlobalTagsUsingCRN(oldList, newList, meta, rID, rType, tType)
if err != nil {
return fmt.Errorf("[ERROR] Error on create of resource tags: %s", err)
return diag.FromErr(fmt.Errorf("Error on create of resource tags: %s", err))
}
}

return resourceIBMResourceTagRead(d, meta)
return resourceIBMResourceTagRead(context, d, meta)
}

func resourceIBMResourceTagDelete(d *schema.ResourceData, meta interface{}) error {
func resourceIBMResourceTagDelete(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var rID, rType string

if strings.HasPrefix(d.Id(), "crn:") {
rID = d.Id()
} else {
parts, err := flex.VmIdParts(d.Id())
if err != nil {
return err
tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_resource_tag", "delete")
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
return tfErr.GetDiag()
}
rID = parts[0]
rType = parts[1]
}

gtClient, err := meta.(conns.ClientSession).GlobalTaggingAPIv1()
if err != nil {
return fmt.Errorf("[ERROR] Error getting global tagging client settings: %s", err)
}

var remove []string
removeTags := d.Get(tags).(*schema.Set)
remove = make([]string, len(removeTags.List()))
for i, v := range removeTags.List() {
remove[i] = fmt.Sprint(v)
}
var tType string
if v, ok := d.GetOk(tagType); ok && v != nil {
tType = v.(string)
Expand All @@ -312,28 +332,9 @@ func resourceIBMResourceTagDelete(d *schema.ResourceData, meta interface{}) erro
}

if len(remove) > 0 {
resources := []globaltaggingv1.Resource{}
r := globaltaggingv1.Resource{ResourceID: flex.PtrToString(rID), ResourceType: flex.PtrToString(rType)}
resources = append(resources, r)

detachTagOptions := &globaltaggingv1.DetachTagOptions{
Resources: resources,
TagNames: remove,
TagType: &tType,
}

_, resp, err := gtClient.DetachTag(detachTagOptions)
err := flex.UpdateGlobalTagsUsingCRN(removeTags, nil, meta, rID, rType, tType)
if err != nil {
return fmt.Errorf("[ERROR] Error detaching resource tags %v: %s\n%s", remove, err, resp)
}
for _, v := range remove {
delTagOptions := &globaltaggingv1.DeleteTagOptions{
TagName: flex.PtrToString(v),
}
_, resp, err := gtClient.DeleteTag(delTagOptions)
if err != nil {
return fmt.Errorf("[ERROR] Error deleting resource tag %v: %s\n%s", v, err, resp)
}
return diag.FromErr(fmt.Errorf("Error on deleting tags: %s", err))
}
}
return nil
Expand Down
Loading