From 5a69d51d199591043e78a6c8b1f6c98d95bdb9c0 Mon Sep 17 00:00:00 2001 From: Fede Barcelona Date: Fri, 12 Dec 2025 09:13:42 +0100 Subject: [PATCH 01/13] fix: create `sysdig_user` if it does not exist remotely --- sysdig/data_source_sysdig_user.go | 10 ++++++++-- sysdig/internal/client/v2/users.go | 28 ++++++++++++++-------------- sysdig/resource_sysdig_user.go | 11 ++++++++--- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/sysdig/data_source_sysdig_user.go b/sysdig/data_source_sysdig_user.go index 42a21d4df..505dd219d 100644 --- a/sysdig/data_source_sysdig_user.go +++ b/sysdig/data_source_sysdig_user.go @@ -2,6 +2,7 @@ package sysdig import ( "context" + "net/http" "strconv" "time" @@ -50,9 +51,14 @@ func dataSourceSysdigUserRead(ctx context.Context, d *schema.ResourceData, meta return diag.FromErr(err) } - u, err := client.GetUserByEmail(ctx, d.Get("email").(string)) + u, statusCode, err := client.GetUserByEmail(ctx, d.Get("email").(string)) if err != nil { - return diag.FromErr(err) + if statusCode == http.StatusNotFound { + d.SetId("") + return nil + } else { + return diag.FromErr(err) + } } d.SetId(strconv.Itoa(u.ID)) diff --git a/sysdig/internal/client/v2/users.go b/sysdig/internal/client/v2/users.go index 28e349fe0..778a38b37 100644 --- a/sysdig/internal/client/v2/users.go +++ b/sysdig/internal/client/v2/users.go @@ -17,19 +17,19 @@ const ( type UserInterface interface { Base - GetUserByID(ctx context.Context, id int) (*User, error) - GetUserByUsername(ctx context.Context, username string) (*User, error) - GetUserByEmail(ctx context.Context, email string) (*User, error) + GetUserByID(ctx context.Context, id int) (*User, int, error) + GetUserByUsername(ctx context.Context, username string) (*User, int, error) + GetUserByEmail(ctx context.Context, email string) (*User, int, error) CreateUser(ctx context.Context, user *User) (*User, error) UpdateUser(ctx context.Context, user *User) (*User, error) DeleteUser(ctx context.Context, id int) error GetCurrentUser(ctx context.Context) (u *User, err error) } -func (c *Client) GetUserByID(ctx context.Context, id int) (user *User, error error) { +func (c *Client) GetUserByID(ctx context.Context, id int) (user *User, statusCode int, error error) { response, err := c.requester.Request(ctx, http.MethodGet, c.getUserURL(id), nil) if err != nil { - return nil, err + return nil, 0, err } defer func() { if dErr := response.Body.Close(); dErr != nil { @@ -38,21 +38,21 @@ func (c *Client) GetUserByID(ctx context.Context, id int) (user *User, error err }() if response.StatusCode != http.StatusOK { - return nil, c.ErrorFromResponse(response) + return nil, response.StatusCode, c.ErrorFromResponse(response) } wrapper, err := Unmarshal[userWrapper](response.Body) if err != nil { - return nil, err + return nil, 0, err } - return &wrapper.User, nil + return &wrapper.User, response.StatusCode, nil } -func (c *Client) GetUserByUsername(ctx context.Context, username string) (user *User, err error) { +func (c *Client) GetUserByUsername(ctx context.Context, username string) (user *User, statusCode int, err error) { response, err := c.requester.Request(ctx, http.MethodGet, c.getUserByUsernameURL(username), nil) if err != nil { - return nil, err + return nil, 0, err } defer func() { if dErr := response.Body.Close(); dErr != nil { @@ -61,18 +61,18 @@ func (c *Client) GetUserByUsername(ctx context.Context, username string) (user * }() if response.StatusCode != http.StatusOK { - return nil, c.ErrorFromResponse(response) + return nil, response.StatusCode, c.ErrorFromResponse(response) } wrapper, err := Unmarshal[userWrapper](response.Body) if err != nil { - return nil, err + return nil, 0, err } - return &wrapper.User, nil + return &wrapper.User, response.StatusCode, nil } -func (c *Client) GetUserByEmail(ctx context.Context, email string) (*User, error) { +func (c *Client) GetUserByEmail(ctx context.Context, email string) (*User, int, error) { return c.GetUserByUsername(ctx, email) } diff --git a/sysdig/resource_sysdig_user.go b/sysdig/resource_sysdig_user.go index 768c5fdb8..142b5c04c 100644 --- a/sysdig/resource_sysdig_user.go +++ b/sysdig/resource_sysdig_user.go @@ -2,6 +2,7 @@ package sysdig import ( "context" + "net/http" "strconv" "time" @@ -80,10 +81,14 @@ func resourceSysdigUserRead(ctx context.Context, d *schema.ResourceData, meta an } id, _ := strconv.Atoi(d.Id()) - u, err := client.GetUserByID(ctx, id) + u, statusCode, err := client.GetUserByID(ctx, id) if err != nil { - d.SetId("") - return diag.FromErr(err) + if statusCode == http.StatusNotFound { + d.SetId("") + return nil + } else { + return diag.FromErr(err) + } } _ = d.Set("version", u.Version) From 90bef3fd5361d118e477bd9ffc0629e2df95a188 Mon Sep 17 00:00:00 2001 From: Fede Barcelona Date: Fri, 12 Dec 2025 09:27:01 +0100 Subject: [PATCH 02/13] fix: prevent panic on missing secure_custom_policy --- sysdig/resource_sysdig_secure_custom_policy.go | 1 + 1 file changed, 1 insertion(+) diff --git a/sysdig/resource_sysdig_secure_custom_policy.go b/sysdig/resource_sysdig_secure_custom_policy.go index d652deae3..c750cf1ba 100644 --- a/sysdig/resource_sysdig_secure_custom_policy.go +++ b/sysdig/resource_sysdig_secure_custom_policy.go @@ -193,6 +193,7 @@ func resourceSysdigCustomPolicyRead(ctx context.Context, d *schema.ResourceData, if err != nil { if statusCode == http.StatusNotFound { d.SetId("") + return nil } else { return diag.FromErr(err) } From 880b469494b0abd818590dffa93cbc9988fad4d9 Mon Sep 17 00:00:00 2001 From: Fede Barcelona Date: Fri, 12 Dec 2025 09:27:46 +0100 Subject: [PATCH 03/13] fix: prevent panic on missing secure_managed_policy --- sysdig/resource_sysdig_secure_managed_policy.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sysdig/resource_sysdig_secure_managed_policy.go b/sysdig/resource_sysdig_secure_managed_policy.go index 0b7537984..7ee57e734 100644 --- a/sysdig/resource_sysdig_secure_managed_policy.go +++ b/sysdig/resource_sysdig_secure_managed_policy.go @@ -115,6 +115,7 @@ func resourceSysdigManagedPolicyRead(ctx context.Context, d *schema.ResourceData if err != nil { if statusCode == http.StatusNotFound { d.SetId("") + return nil } else { return diag.FromErr(err) } @@ -139,6 +140,7 @@ func resourceSysdigManagedPolicyDelete(ctx context.Context, d *schema.ResourceDa if err != nil { if statusCode == http.StatusNotFound { d.SetId("") + return nil } else { return diag.FromErr(err) } @@ -176,6 +178,7 @@ func resourceSysdigManagedPolicyUpdate(ctx context.Context, d *schema.ResourceDa if err != nil { if statusCode == http.StatusNotFound { d.SetId("") + return nil } else { return diag.FromErr(err) } From 6f671cc56b0d0bd12c53e4b00902d034e63cd566 Mon Sep 17 00:00:00 2001 From: Fede Barcelona Date: Fri, 12 Dec 2025 09:28:09 +0100 Subject: [PATCH 04/13] fix: prevent panic on missing secure_rule_container --- sysdig/resource_sysdig_secure_rule_container.go | 1 + 1 file changed, 1 insertion(+) diff --git a/sysdig/resource_sysdig_secure_rule_container.go b/sysdig/resource_sysdig_secure_rule_container.go index b5c33ed56..c3cccef93 100644 --- a/sysdig/resource_sysdig_secure_rule_container.go +++ b/sysdig/resource_sysdig_secure_rule_container.go @@ -86,6 +86,7 @@ func resourceSysdigRuleContainerRead(ctx context.Context, d *schema.ResourceData if err != nil { if statusCode == http.StatusNotFound { d.SetId("") + return nil } else { return diag.FromErr(err) } From 7f20937d3dcc0fe554ef415f87b496cef2cb84bf Mon Sep 17 00:00:00 2001 From: Fede Barcelona Date: Fri, 12 Dec 2025 09:28:34 +0100 Subject: [PATCH 05/13] fix: prevent panic on missing secure_rule_falco --- sysdig/resource_sysdig_secure_rule_falco.go | 1 + 1 file changed, 1 insertion(+) diff --git a/sysdig/resource_sysdig_secure_rule_falco.go b/sysdig/resource_sysdig_secure_rule_falco.go index ea6e7c63f..2ae744c12 100644 --- a/sysdig/resource_sysdig_secure_rule_falco.go +++ b/sysdig/resource_sysdig_secure_rule_falco.go @@ -140,6 +140,7 @@ func resourceSysdigRuleFalcoRead(ctx context.Context, d *schema.ResourceData, me if err != nil { if statusCode == http.StatusNotFound { d.SetId("") + return nil } else { return diag.FromErr(err) } From 18efa84472b61c85334ce2623b35d841c594d2da Mon Sep 17 00:00:00 2001 From: Fede Barcelona Date: Fri, 12 Dec 2025 09:28:59 +0100 Subject: [PATCH 06/13] fix: prevent panic on missing secure_rule_filesystem --- sysdig/resource_sysdig_secure_rule_filesystem.go | 1 + 1 file changed, 1 insertion(+) diff --git a/sysdig/resource_sysdig_secure_rule_filesystem.go b/sysdig/resource_sysdig_secure_rule_filesystem.go index 17e65ce2a..2ba5810af 100644 --- a/sysdig/resource_sysdig_secure_rule_filesystem.go +++ b/sysdig/resource_sysdig_secure_rule_filesystem.go @@ -117,6 +117,7 @@ func resourceSysdigRuleFilesystemRead(ctx context.Context, d *schema.ResourceDat if err != nil { if statusCode == http.StatusNotFound { d.SetId("") + return nil } else { return diag.FromErr(err) } From c4ab0ef8bcf226cdfa000d912a2b7c2978ab2b77 Mon Sep 17 00:00:00 2001 From: Fede Barcelona Date: Fri, 12 Dec 2025 09:29:26 +0100 Subject: [PATCH 07/13] fix: prevent panic on missing secure_rule_network --- sysdig/resource_sysdig_secure_rule_network.go | 1 + 1 file changed, 1 insertion(+) diff --git a/sysdig/resource_sysdig_secure_rule_network.go b/sysdig/resource_sysdig_secure_rule_network.go index 4ed87a356..8c8d95e06 100644 --- a/sysdig/resource_sysdig_secure_rule_network.go +++ b/sysdig/resource_sysdig_secure_rule_network.go @@ -125,6 +125,7 @@ func resourceSysdigRuleNetworkRead(ctx context.Context, d *schema.ResourceData, if err != nil { if statusCode == http.StatusNotFound { d.SetId("") + return nil } else { return diag.FromErr(err) } From 283718ab7860da033b80cd9603682c8d775a1036 Mon Sep 17 00:00:00 2001 From: Fede Barcelona Date: Fri, 12 Dec 2025 09:29:48 +0100 Subject: [PATCH 08/13] fix: prevent panic on missing secure_rule_process --- sysdig/resource_sysdig_secure_rule_process.go | 1 + 1 file changed, 1 insertion(+) diff --git a/sysdig/resource_sysdig_secure_rule_process.go b/sysdig/resource_sysdig_secure_rule_process.go index 80c327bd3..ccba057f9 100644 --- a/sysdig/resource_sysdig_secure_rule_process.go +++ b/sysdig/resource_sysdig_secure_rule_process.go @@ -86,6 +86,7 @@ func resourceSysdigRuleProcessRead(ctx context.Context, d *schema.ResourceData, if err != nil { if statusCode == http.StatusNotFound { d.SetId("") + return nil } else { return diag.FromErr(err) } From 0fcc6450785c065bb56ca94486b162392d880fb5 Mon Sep 17 00:00:00 2001 From: Fede Barcelona Date: Fri, 12 Dec 2025 09:30:15 +0100 Subject: [PATCH 09/13] fix: prevent panic on missing secure_rule_syscall --- sysdig/resource_sysdig_secure_rule_syscall.go | 1 + 1 file changed, 1 insertion(+) diff --git a/sysdig/resource_sysdig_secure_rule_syscall.go b/sysdig/resource_sysdig_secure_rule_syscall.go index 94a71831d..a54e67753 100644 --- a/sysdig/resource_sysdig_secure_rule_syscall.go +++ b/sysdig/resource_sysdig_secure_rule_syscall.go @@ -85,6 +85,7 @@ func resourceSysdigRuleSyscallRead(ctx context.Context, d *schema.ResourceData, if err != nil { if statusCode == http.StatusNotFound { d.SetId("") + return nil } else { return diag.FromErr(err) } From c4e9cf0475809a689eb9c0ee875321df027e791b Mon Sep 17 00:00:00 2001 From: Fede Barcelona Date: Fri, 12 Dec 2025 09:31:19 +0100 Subject: [PATCH 10/13] fix: handle drift for monitor_team --- sysdig/resource_sysdig_monitor_team.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sysdig/resource_sysdig_monitor_team.go b/sysdig/resource_sysdig_monitor_team.go index e06913191..b4e7425e6 100644 --- a/sysdig/resource_sysdig_monitor_team.go +++ b/sysdig/resource_sysdig_monitor_team.go @@ -3,6 +3,7 @@ package sysdig import ( "context" "strconv" + "strings" "time" v2 "github.com/draios/terraform-provider-sysdig/sysdig/internal/client/v2" @@ -185,7 +186,10 @@ func resourceSysdigMonitorTeamRead(ctx context.Context, d *schema.ResourceData, id, _ := strconv.Atoi(d.Id()) t, err := client.GetTeamByID(ctx, id) if err != nil { - d.SetId("") + if strings.Contains(err.Error(), "404") { + d.SetId("") + return nil + } return diag.FromErr(err) } From ad6638542364665e2b7ba5545f9bbdcf2e920dfa Mon Sep 17 00:00:00 2001 From: Fede Barcelona Date: Fri, 12 Dec 2025 09:32:02 +0100 Subject: [PATCH 11/13] fix: handle drift for secure_team --- sysdig/resource_sysdig_secure_team.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sysdig/resource_sysdig_secure_team.go b/sysdig/resource_sysdig_secure_team.go index 1f8a66adb..2965d26f1 100644 --- a/sysdig/resource_sysdig_secure_team.go +++ b/sysdig/resource_sysdig_secure_team.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "strconv" + "strings" "time" v2 "github.com/draios/terraform-provider-sysdig/sysdig/internal/client/v2" @@ -180,7 +181,10 @@ func resourceSysdigSecureTeamRead(ctx context.Context, d *schema.ResourceData, m id, _ := strconv.Atoi(d.Id()) t, err := client.GetTeamByID(ctx, id) if err != nil { - d.SetId("") + if strings.Contains(err.Error(), "404") { + d.SetId("") + return nil + } return diag.FromErr(err) } From 5f357944dbc5b075a8e84406d45e145c5bc56ab8 Mon Sep 17 00:00:00 2001 From: Fede Barcelona Date: Fri, 12 Dec 2025 09:32:44 +0100 Subject: [PATCH 12/13] fix: handle drift for agent_access_key and teams Refactors client GetTeamByID and GetAgentAccessKeyByID to return status codes. --- sysdig/data_source_agent_access_keys.go | 2 +- sysdig/data_source_sysdig_monitor_team.go | 2 +- sysdig/data_source_sysdig_secure_team.go | 2 +- sysdig/internal/client/v2/agentaccesskey.go | 11 ++++++----- sysdig/internal/client/v2/teams.go | 12 ++++++------ sysdig/resource_sysdig_agent_access_key.go | 6 +++++- sysdig/resource_sysdig_monitor_team.go | 5 ++--- sysdig/resource_sysdig_secure_team.go | 5 ++--- 8 files changed, 24 insertions(+), 21 deletions(-) diff --git a/sysdig/data_source_agent_access_keys.go b/sysdig/data_source_agent_access_keys.go index 3a089957c..f8b570ddd 100644 --- a/sysdig/data_source_agent_access_keys.go +++ b/sysdig/data_source_agent_access_keys.go @@ -68,7 +68,7 @@ func dataSourceSysdigAgentAccessKeyRead(ctx context.Context, d *schema.ResourceD } agentKeyID := d.Get("id").(int) - agentAccessKey, err := client.GetAgentAccessKeyByID(ctx, strconv.Itoa(agentKeyID)) + agentAccessKey, _, err := client.GetAgentAccessKeyByID(ctx, strconv.Itoa(agentKeyID)) if err != nil { return diag.FromErr(err) } diff --git a/sysdig/data_source_sysdig_monitor_team.go b/sysdig/data_source_sysdig_monitor_team.go index 7cfd8cf03..08d6b8a5b 100644 --- a/sysdig/data_source_sysdig_monitor_team.go +++ b/sysdig/data_source_sysdig_monitor_team.go @@ -120,7 +120,7 @@ func dataSourceSysdigMonitorTeamRead(ctx context.Context, d *schema.ResourceData return diag.FromErr(err) } - team, err := client.GetTeamByID(ctx, id) + team, _, err := client.GetTeamByID(ctx, id) if err != nil { return diag.FromErr(err) } diff --git a/sysdig/data_source_sysdig_secure_team.go b/sysdig/data_source_sysdig_secure_team.go index e63ce9c9d..f76c7c2df 100644 --- a/sysdig/data_source_sysdig_secure_team.go +++ b/sysdig/data_source_sysdig_secure_team.go @@ -99,7 +99,7 @@ func dataSourceSysdigSecureTeamRead(ctx context.Context, d *schema.ResourceData, return diag.FromErr(err) } - team, err := client.GetTeamByID(ctx, id) + team, _, err := client.GetTeamByID(ctx, id) if err != nil { return diag.FromErr(err) } diff --git a/sysdig/internal/client/v2/agentaccesskey.go b/sysdig/internal/client/v2/agentaccesskey.go index bb2926bc0..197d098a2 100644 --- a/sysdig/internal/client/v2/agentaccesskey.go +++ b/sysdig/internal/client/v2/agentaccesskey.go @@ -15,16 +15,16 @@ const ( type AgentAccessKeyInterface interface { Base - GetAgentAccessKeyByID(ctx context.Context, id string) (*AgentAccessKey, error) + GetAgentAccessKeyByID(ctx context.Context, id string) (*AgentAccessKey, int, error) CreateAgentAccessKey(ctx context.Context, agentAccessKey *AgentAccessKey) (*AgentAccessKey, error) DeleteAgentAccessKey(ctx context.Context, id string) error UpdateAgentAccessKey(ctx context.Context, agentAccessKey *AgentAccessKey, id string) (*AgentAccessKey, error) } -func (c *Client) GetAgentAccessKeyByID(ctx context.Context, id string) (accessKey *AgentAccessKey, err error) { +func (c *Client) GetAgentAccessKeyByID(ctx context.Context, id string) (accessKey *AgentAccessKey, statusCode int, err error) { response, err := c.requester.Request(ctx, http.MethodGet, c.getAgentAccessKeyByIDUrl(id), nil) if err != nil { - return nil, err + return nil, 0, err } defer func() { if dErr := response.Body.Close(); dErr != nil { @@ -34,10 +34,11 @@ func (c *Client) GetAgentAccessKeyByID(ctx context.Context, id string) (accessKe if response.StatusCode != http.StatusOK { err = c.ErrorFromResponse(response) - return nil, err + return nil, response.StatusCode, err } - return Unmarshal[*AgentAccessKey](response.Body) + result, err := Unmarshal[*AgentAccessKey](response.Body) + return result, response.StatusCode, err } func (c *Client) CreateAgentAccessKey(ctx context.Context, agentAccessKey *AgentAccessKey) (createdAccessKey *AgentAccessKey, err error) { diff --git a/sysdig/internal/client/v2/teams.go b/sysdig/internal/client/v2/teams.go index 4783dc4f9..e91d539ed 100644 --- a/sysdig/internal/client/v2/teams.go +++ b/sysdig/internal/client/v2/teams.go @@ -15,7 +15,7 @@ const ( type TeamInterface interface { Base GetUserIDByEmail(ctx context.Context, userRoles []UserRoles) ([]UserRoles, error) - GetTeamByID(ctx context.Context, id int) (t Team, err error) + GetTeamByID(ctx context.Context, id int) (t Team, statusCode int, err error) CreateTeam(ctx context.Context, tRequest Team) (t Team, err error) UpdateTeam(ctx context.Context, tRequest Team) (t Team, err error) DeleteTeam(ctx context.Context, id int) error @@ -66,10 +66,10 @@ func (c *Client) GetUserIDByEmail(ctx context.Context, userRoles []UserRoles) (m return modifiedUserRoles, nil } -func (c *Client) GetTeamByID(ctx context.Context, id int) (team Team, err error) { +func (c *Client) GetTeamByID(ctx context.Context, id int) (team Team, statusCode int, err error) { response, err := c.requester.Request(ctx, http.MethodGet, c.getTeamURL(id), nil) if err != nil { - return Team{}, err + return Team{}, 0, err } defer func() { if dErr := response.Body.Close(); dErr != nil { @@ -78,15 +78,15 @@ func (c *Client) GetTeamByID(ctx context.Context, id int) (team Team, err error) }() if response.StatusCode != http.StatusOK { - return Team{}, c.ErrorFromResponse(response) + return Team{}, response.StatusCode, c.ErrorFromResponse(response) } wrapper, err := Unmarshal[teamWrapper](response.Body) if err != nil { - return Team{}, c.ErrorFromResponse(response) + return Team{}, response.StatusCode, c.ErrorFromResponse(response) } - return wrapper.Team, err + return wrapper.Team, response.StatusCode, err } func (c *Client) CreateTeam(ctx context.Context, team Team) (createdTeam Team, err error) { diff --git a/sysdig/resource_sysdig_agent_access_key.go b/sysdig/resource_sysdig_agent_access_key.go index b21d39479..ca968064d 100644 --- a/sysdig/resource_sysdig_agent_access_key.go +++ b/sysdig/resource_sysdig_agent_access_key.go @@ -157,8 +157,12 @@ func resourceSysdigAgentAccessKeyRead(ctx context.Context, d *schema.ResourceDat agentKeyID := d.Id() - agentAccessKey, err := client.GetAgentAccessKeyByID(ctx, agentKeyID) + agentAccessKey, statusCode, err := client.GetAgentAccessKeyByID(ctx, agentKeyID) if err != nil { + if statusCode == 404 { + d.SetId("") + return nil + } return diag.FromErr(err) } diff --git a/sysdig/resource_sysdig_monitor_team.go b/sysdig/resource_sysdig_monitor_team.go index b4e7425e6..34524a70d 100644 --- a/sysdig/resource_sysdig_monitor_team.go +++ b/sysdig/resource_sysdig_monitor_team.go @@ -3,7 +3,6 @@ package sysdig import ( "context" "strconv" - "strings" "time" v2 "github.com/draios/terraform-provider-sysdig/sysdig/internal/client/v2" @@ -184,9 +183,9 @@ func resourceSysdigMonitorTeamRead(ctx context.Context, d *schema.ResourceData, } id, _ := strconv.Atoi(d.Id()) - t, err := client.GetTeamByID(ctx, id) + t, statusCode, err := client.GetTeamByID(ctx, id) if err != nil { - if strings.Contains(err.Error(), "404") { + if statusCode == 404 { d.SetId("") return nil } diff --git a/sysdig/resource_sysdig_secure_team.go b/sysdig/resource_sysdig_secure_team.go index 2965d26f1..0466db182 100644 --- a/sysdig/resource_sysdig_secure_team.go +++ b/sysdig/resource_sysdig_secure_team.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "strconv" - "strings" "time" v2 "github.com/draios/terraform-provider-sysdig/sysdig/internal/client/v2" @@ -179,9 +178,9 @@ func resourceSysdigSecureTeamRead(ctx context.Context, d *schema.ResourceData, m } id, _ := strconv.Atoi(d.Id()) - t, err := client.GetTeamByID(ctx, id) + t, statusCode, err := client.GetTeamByID(ctx, id) if err != nil { - if strings.Contains(err.Error(), "404") { + if statusCode == 404 { d.SetId("") return nil } From bdea537ff9762b7f66a4a494032c0580c932414c Mon Sep 17 00:00:00 2001 From: Fede Barcelona Date: Fri, 12 Dec 2025 09:39:29 +0100 Subject: [PATCH 13/13] fix: handle drift for agent_access_key and teams Refactors client GetTeamByID and GetAgentAccessKeyByID to return status codes. Checks for http.StatusNotFound to gracefully handle drift in resources. --- sysdig/data_source_agent_access_keys.go | 7 ++++++- sysdig/data_source_sysdig_monitor_team.go | 7 ++++++- sysdig/data_source_sysdig_secure_team.go | 7 ++++++- sysdig/resource_sysdig_agent_access_key.go | 3 ++- sysdig/resource_sysdig_monitor_team.go | 3 ++- sysdig/resource_sysdig_secure_team.go | 3 ++- 6 files changed, 24 insertions(+), 6 deletions(-) diff --git a/sysdig/data_source_agent_access_keys.go b/sysdig/data_source_agent_access_keys.go index f8b570ddd..bf175409e 100644 --- a/sysdig/data_source_agent_access_keys.go +++ b/sysdig/data_source_agent_access_keys.go @@ -2,6 +2,7 @@ package sysdig import ( "context" + "net/http" "strconv" "time" @@ -68,8 +69,12 @@ func dataSourceSysdigAgentAccessKeyRead(ctx context.Context, d *schema.ResourceD } agentKeyID := d.Get("id").(int) - agentAccessKey, _, err := client.GetAgentAccessKeyByID(ctx, strconv.Itoa(agentKeyID)) + agentAccessKey, statusCode, err := client.GetAgentAccessKeyByID(ctx, strconv.Itoa(agentKeyID)) if err != nil { + if statusCode == http.StatusNotFound { + d.SetId("") + return nil + } return diag.FromErr(err) } d.SetId(strconv.Itoa(agentAccessKey.ID)) diff --git a/sysdig/data_source_sysdig_monitor_team.go b/sysdig/data_source_sysdig_monitor_team.go index 08d6b8a5b..dfe48a4ef 100644 --- a/sysdig/data_source_sysdig_monitor_team.go +++ b/sysdig/data_source_sysdig_monitor_team.go @@ -2,6 +2,7 @@ package sysdig import ( "context" + "net/http" "strconv" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" @@ -120,8 +121,12 @@ func dataSourceSysdigMonitorTeamRead(ctx context.Context, d *schema.ResourceData return diag.FromErr(err) } - team, _, err := client.GetTeamByID(ctx, id) + team, statusCode, err := client.GetTeamByID(ctx, id) if err != nil { + if statusCode == http.StatusNotFound { + d.SetId("") + return nil + } return diag.FromErr(err) } diff --git a/sysdig/data_source_sysdig_secure_team.go b/sysdig/data_source_sysdig_secure_team.go index f76c7c2df..91219adb5 100644 --- a/sysdig/data_source_sysdig_secure_team.go +++ b/sysdig/data_source_sysdig_secure_team.go @@ -2,6 +2,7 @@ package sysdig import ( "context" + "net/http" "strconv" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" @@ -99,8 +100,12 @@ func dataSourceSysdigSecureTeamRead(ctx context.Context, d *schema.ResourceData, return diag.FromErr(err) } - team, _, err := client.GetTeamByID(ctx, id) + team, statusCode, err := client.GetTeamByID(ctx, id) if err != nil { + if statusCode == http.StatusNotFound { + d.SetId("") + return nil + } return diag.FromErr(err) } diff --git a/sysdig/resource_sysdig_agent_access_key.go b/sysdig/resource_sysdig_agent_access_key.go index ca968064d..6faef8fe0 100644 --- a/sysdig/resource_sysdig_agent_access_key.go +++ b/sysdig/resource_sysdig_agent_access_key.go @@ -3,6 +3,7 @@ package sysdig import ( "context" "fmt" + "net/http" "strconv" "time" @@ -159,7 +160,7 @@ func resourceSysdigAgentAccessKeyRead(ctx context.Context, d *schema.ResourceDat agentAccessKey, statusCode, err := client.GetAgentAccessKeyByID(ctx, agentKeyID) if err != nil { - if statusCode == 404 { + if statusCode == http.StatusNotFound { d.SetId("") return nil } diff --git a/sysdig/resource_sysdig_monitor_team.go b/sysdig/resource_sysdig_monitor_team.go index 34524a70d..83e80cd4f 100644 --- a/sysdig/resource_sysdig_monitor_team.go +++ b/sysdig/resource_sysdig_monitor_team.go @@ -2,6 +2,7 @@ package sysdig import ( "context" + "net/http" "strconv" "time" @@ -185,7 +186,7 @@ func resourceSysdigMonitorTeamRead(ctx context.Context, d *schema.ResourceData, id, _ := strconv.Atoi(d.Id()) t, statusCode, err := client.GetTeamByID(ctx, id) if err != nil { - if statusCode == 404 { + if statusCode == http.StatusNotFound { d.SetId("") return nil } diff --git a/sysdig/resource_sysdig_secure_team.go b/sysdig/resource_sysdig_secure_team.go index 0466db182..069cc2b93 100644 --- a/sysdig/resource_sysdig_secure_team.go +++ b/sysdig/resource_sysdig_secure_team.go @@ -3,6 +3,7 @@ package sysdig import ( "context" "fmt" + "net/http" "strconv" "time" @@ -180,7 +181,7 @@ func resourceSysdigSecureTeamRead(ctx context.Context, d *schema.ResourceData, m id, _ := strconv.Atoi(d.Id()) t, statusCode, err := client.GetTeamByID(ctx, id) if err != nil { - if statusCode == 404 { + if statusCode == http.StatusNotFound { d.SetId("") return nil }