splunk / terraform-provider-splunk

Terraform Provider for Splunk
Mozilla Public License 2.0
102 stars 75 forks source link

Created a `splunk_data_ui_views` via Terraform, Updating `.xml` source file results in "404 Not Found" upon `terraform apply` #182

Open abudri opened 7 months ago

abudri commented 7 months ago

Hello,

I am working with the splunk_data_ui_views and deployed a dashboard via terraform:

https://registry.terraform.io/providers/splunk/splunk/latest/docs/resources/data_ui_views

Code in main.tf

resource "splunk_data_ui_views" "my_dashboard" {
  name      = "Terraform_Sample_Dashboard"
  eai_data = file("my_dashboard.xml") 

  acl {
    owner = var.splunk_username
    app              = "MY_APP"
    sharing          = "app"
    can_change_perms = true
    can_write        = true
  }
}

What Worked

We were able to create the dashboard after the first terraform apply, and that went to success and the dashboard shows up in Splunk.

Error(404): What Isn't Working, Changing a Simple property in the source XML

I simply went to change a small part of the xml in a dropdown, changing:

<choice value="myenvironment">myenvironment</choice>

to:

<choice value="myenvironment">myenvironment-edit</choice>

appending that edit part on just to tinker with the dashboard. The terraform plan was successful and just shows a change to that part of the xml source file:

-        <choice value="myenvironment">myenvironment</choice>
+        <choice value="myenvironment">myenvironment-edit</choice>

But upon terraform apply we get a 404 error:

| Error: 404 Not Found: {"messges":[{"type":"ERROR","text":"Cannot find entity with name=\"Terraform_Sample_Dashboard\""}]}
|
| with splunk_data_ui_views.my_dashboard,
| on main.tf line 2, in resource "splunk_data_ui_views" "my_dashboard":
| 2: resource "splunk_data_ui_views" "my_dashboard" {

But that doesn't make immediate sense, since:

  1. terraform state list shows my splunk_data_ui_views.my_dashboard just fine
  2. The dashboard we created originally from the original terraform apply is also in the UI, so the state file is tracking the real world resource in Splunk?

So, why can't I simply make an edit of my source xml file if the plan is happy, but I get a 404 upon terraform apply.

I've worked with other Terraform providers like Terraform AWS and Terraform New Relic, and a simple property update is pretty seamless.

I've also noticed that the id of the dashboard is taken from the name we create the resource "splunk_data_ui_views" with. Could in the future the id be turned into a unique integer? Seems there is some co-dependency between the id and the name, but could be mistaken. But we do notice, the id created, known only after we run terraform apply, literally becomes the same as the name).

All this could be me simply being unfamiliar with Splunk and the TF provider for it. Any suggestions are appreciated. Thanks!

PS: We noticed that it appears the name property of the dashboard only accepts -, _, and . for special characters. Is there a place I can make a PR to update the documentation page for the resource here to note that? The error that is thrown if we have special characters outside of those three could also be improved. Just makes it easier to have that handy in the doc. acl properties also might be nice to have.

dklbe commented 6 months ago

I had the same problem. Unlike the get dashboard or create dashboard request in the Splunk api the update dashboard request expects owner="nobody" in the request path (if the dashboard is not privat). This is not reflected in the current release of this provider. However, PR seems to be ready to solve this issue. For me the following workaround helped for now:

resource "splunk_data_ui_views" "dashboard" {
  name     = "TestDashboard"
   eai_data = file("test_dashboard.xml") 
   acl {
      owner = "nobody"
      app = "testapptf"
  }
}
ojensen5115 commented 4 months ago

@dklbe i think your workaround only works if the terraform user is an admin, or else you'll get errors indicating that you do not have permission to change the owner of the dashboard.