diff --git a/libvirt/resource_libvirt_domain.go b/libvirt/resource_libvirt_domain.go index 413a58485..7f0f8da76 100644 --- a/libvirt/resource_libvirt_domain.go +++ b/libvirt/resource_libvirt_domain.go @@ -35,6 +35,7 @@ func resourceLibvirtDomain() *schema.Resource { ReadContext: resourceLibvirtDomainRead, DeleteContext: resourceLibvirtDomainDelete, UpdateContext: resourceLibvirtDomainUpdate, + CustomizeDiff: resourceLibvirtDomainCustomDiff, Importer: &schema.ResourceImporter{ StateContext: schema.ImportStatePassthroughContext, }, @@ -48,6 +49,11 @@ func resourceLibvirtDomain() *schema.Resource { Required: true, ForceNew: true, }, + "title": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + }, "description": { Type: schema.TypeString, Optional: true, @@ -494,6 +500,13 @@ func resourceLibvirtDomainCreate(ctx context.Context, d *schema.ResourceData, me domainDef.Name = name.(string) } + if title, ok := d.GetOk("title"); ok { + if strings.Contains(title.(string), "\n") { + return diag.Errorf("title attribute should not contain newline characters") + } + domainDef.Title = title.(string) + } + if cpuMode, ok := d.GetOk("cpu.0.mode"); ok { domainDef.CPU = &libvirtxml.DomainCPU{ Mode: cpuMode.(string), @@ -807,6 +820,7 @@ func resourceLibvirtDomainRead(ctx context.Context, d *schema.ResourceData, meta } d.Set("name", domainDef.Name) + d.Set("title", domainDef.Title) d.Set("description", domainDef.Description) d.Set("vcpu", domainDef.VCPU.Value) @@ -1123,3 +1137,13 @@ func resourceLibvirtDomainDelete(ctx context.Context, d *schema.ResourceData, me return nil } + +func resourceLibvirtDomainCustomDiff(ctx context.Context, d *schema.ResourceDiff, meta interface{}) error { + if d.HasChange("title") { + _, newTitle := d.GetChange("title") + if strings.Contains(newTitle.(string), "\n") { + return fmt.Errorf("title attribute should not contain newline characters") + } + } + return nil +} diff --git a/libvirt/resource_libvirt_domain_test.go b/libvirt/resource_libvirt_domain_test.go index 8127f2d67..94897f39a 100644 --- a/libvirt/resource_libvirt_domain_test.go +++ b/libvirt/resource_libvirt_domain_test.go @@ -6,6 +6,7 @@ import ( "net/url" "os" "path/filepath" + "regexp" "testing" testhelper "github.com/dmacvicar/terraform-provider-libvirt/libvirt/helper/test" @@ -73,6 +74,52 @@ func TestAccLibvirtDomain_Description(t *testing.T) { }) } +func TestAccLibvirtDomain_Title(t *testing.T) { + var domain libvirt.Domain + randomResourceName := acctest.RandStringFromCharSet(10, acctest.CharSetAlpha) + randomDomainName := acctest.RandStringFromCharSet(10, acctest.CharSetAlpha) + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckLibvirtDomainDestroy, + Steps: []resource.TestStep{ + { + Config: fmt.Sprintf(` + resource "libvirt_domain" "%s" { + name = "%s" + title = "invalid\n unit test title" + }`, randomResourceName, randomDomainName), + ResourceName: "libvirt_domain." + randomResourceName, + ExpectError: regexp.MustCompile("title attribute should not contain newline characters"), + }, + { + Config: fmt.Sprintf(` + resource "libvirt_domain" "%s" { + name = "%s" + title = "unit test title" + }`, randomResourceName, randomDomainName), + Check: resource.ComposeTestCheckFunc( + testAccCheckLibvirtDomainExists("libvirt_domain."+randomResourceName, &domain), + resource.TestCheckResourceAttr( + "libvirt_domain."+randomResourceName, "name", randomDomainName), + resource.TestCheckResourceAttr( + "libvirt_domain."+randomResourceName, "title", "unit test title"), + ), + ResourceName: "libvirt_domain." + randomDomainName, + }, + { + Config: fmt.Sprintf(` + resource "libvirt_domain" "%s" { + name = "%s" + title = "unit test title\n update failure" + }`, randomResourceName, randomDomainName), + ResourceName: "libvirt_domain." + randomDomainName, + ExpectError: regexp.MustCompile("title attribute should not contain newline characters"), + }, + }, + }) +} + func TestAccLibvirtDomain_Detailed(t *testing.T) { var domain libvirt.Domain randomResourceName := acctest.RandStringFromCharSet(10, acctest.CharSetAlpha)