From 69b22f63d33f5c8ed8c258ce31b09c06041241f8 Mon Sep 17 00:00:00 2001 From: Platon Ryzhikov Date: Fri, 27 Dec 2024 12:06:01 +0300 Subject: [PATCH 1/4] implement vcpus as block supported attributes: count for vpus count (replaces vcpus format used previously) placement - auto or static spuset - allows binding to specific cores on host --- libvirt/resource_libvirt_domain.go | 48 ++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/libvirt/resource_libvirt_domain.go b/libvirt/resource_libvirt_domain.go index 413a58485..551b44c3b 100644 --- a/libvirt/resource_libvirt_domain.go +++ b/libvirt/resource_libvirt_domain.go @@ -59,10 +59,31 @@ func resourceLibvirtDomain() *schema.Resource { ForceNew: false, }, "vcpu": { - Type: schema.TypeInt, + Type: schema.TypeList, + MaxItems: 1, Optional: true, - Default: 1, + Computed: true, ForceNew: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "count": { + Type: schema.TypeInt, + Optional: true, + Default: 1, + ForceNew: true, + }, + "cpuset": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + }, + "placement": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + }, + }, + }, }, "memory": { Type: schema.TypeInt, @@ -504,8 +525,17 @@ func resourceLibvirtDomainCreate(ctx context.Context, d *schema.ResourceData, me Value: uint(d.Get("memory").(int)), Unit: "MiB", } - domainDef.VCPU = &libvirtxml.DomainVCPU{ - Value: uint(d.Get("vcpu").(int)), + if cpuSet, ok := d.GetOk("vcpu.0.cpuset"); ok { + domainDef.VCPU = &libvirtxml.DomainVCPU{ + CPUSet: cpuSet.(string), + Placement: d.Get("vcpu.0.placement").(string), + Value: uint(d.Get("vcpu.0.count").(int)), + } + } else { + domainDef.VCPU = &libvirtxml.DomainVCPU{ + Placement: d.Get("vcpu.0.placement").(string), + Value: uint(d.Get("vcpu.0.count").(int)), + } } domainDef.Description = d.Get("description").(string) @@ -808,7 +838,15 @@ func resourceLibvirtDomainRead(ctx context.Context, d *schema.ResourceData, meta d.Set("name", domainDef.Name) d.Set("description", domainDef.Description) - d.Set("vcpu", domainDef.VCPU.Value) + if domainDef.VCPU != nil { + vcpu := make(map[string]interface{}) + var vcpus []map[string]interface{} + vcpu["count"] = domainDef.VCPU.Value + vcpu["placement"] = domainDef.VCPU.Placement + vcpu["cpuset"] = domainDef.VCPU.CPUSet + vcpus = append(vcpus, vcpu) + d.Set("vcpu", vcpus) + } switch domainDef.Memory.Unit { case "KiB": From 3e235b2ce08c27b304a35ef879fae2d8e495c50f Mon Sep 17 00:00:00 2001 From: Platon Ryzhikov Date: Fri, 27 Dec 2024 12:51:29 +0300 Subject: [PATCH 2/4] remove unnecessary condition --- libvirt/resource_libvirt_domain.go | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/libvirt/resource_libvirt_domain.go b/libvirt/resource_libvirt_domain.go index 551b44c3b..ff711a385 100644 --- a/libvirt/resource_libvirt_domain.go +++ b/libvirt/resource_libvirt_domain.go @@ -525,17 +525,10 @@ func resourceLibvirtDomainCreate(ctx context.Context, d *schema.ResourceData, me Value: uint(d.Get("memory").(int)), Unit: "MiB", } - if cpuSet, ok := d.GetOk("vcpu.0.cpuset"); ok { - domainDef.VCPU = &libvirtxml.DomainVCPU{ - CPUSet: cpuSet.(string), - Placement: d.Get("vcpu.0.placement").(string), - Value: uint(d.Get("vcpu.0.count").(int)), - } - } else { - domainDef.VCPU = &libvirtxml.DomainVCPU{ - Placement: d.Get("vcpu.0.placement").(string), - Value: uint(d.Get("vcpu.0.count").(int)), - } + domainDef.VCPU = &libvirtxml.DomainVCPU{ + CPUSet: d.Get("vcpu.0.cpuset").(string), + Placement: d.Get("vcpu.0.placement").(string), + Value: uint(d.Get("vcpu.0.count").(int)), } domainDef.Description = d.Get("description").(string) From 3b3b5a6cf9b528973a8e7f9a0bbcf88456ed02e6 Mon Sep 17 00:00:00 2001 From: Platon Ryzhikov Date: Fri, 27 Dec 2024 14:01:21 +0300 Subject: [PATCH 3/4] fix default vcpu behavior --- libvirt/resource_libvirt_domain.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/libvirt/resource_libvirt_domain.go b/libvirt/resource_libvirt_domain.go index ff711a385..4f649b03b 100644 --- a/libvirt/resource_libvirt_domain.go +++ b/libvirt/resource_libvirt_domain.go @@ -525,10 +525,18 @@ func resourceLibvirtDomainCreate(ctx context.Context, d *schema.ResourceData, me Value: uint(d.Get("memory").(int)), Unit: "MiB", } - domainDef.VCPU = &libvirtxml.DomainVCPU{ - CPUSet: d.Get("vcpu.0.cpuset").(string), - Placement: d.Get("vcpu.0.placement").(string), - Value: uint(d.Get("vcpu.0.count").(int)), + if vcpuCount, ok := d.GetOk("vcpu.0.count"); ok { + domainDef.VCPU = &libvirtxml.DomainVCPU{ + CPUSet: d.Get("vcpu.0.cpuset").(string), + Placement: d.Get("vcpu.0.placement").(string), + Value: uint(vcpuCount.(int)), + } + } else { + domainDef.VCPU = &libvirtxml.DomainVCPU{ + CPUSet: d.Get("vcpu.0.cpuset").(string), + Placement: d.Get("vcpu.0.placement").(string), + Value: 1, + } } domainDef.Description = d.Get("description").(string) From d13251129ba625353431b72361fb9fa4c956efef Mon Sep 17 00:00:00 2001 From: Platon Ryzhikov Date: Fri, 27 Dec 2024 14:26:54 +0300 Subject: [PATCH 4/4] reflect vcpu changes in domain tests --- libvirt/resource_libvirt_domain_test.go | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/libvirt/resource_libvirt_domain_test.go b/libvirt/resource_libvirt_domain_test.go index 8127f2d67..9e044def9 100644 --- a/libvirt/resource_libvirt_domain_test.go +++ b/libvirt/resource_libvirt_domain_test.go @@ -39,7 +39,7 @@ func TestAccLibvirtDomain_Basic(t *testing.T) { resource.TestCheckResourceAttr( "libvirt_domain."+randomResourceName, "memory", "512"), resource.TestCheckResourceAttr( - "libvirt_domain."+randomResourceName, "vcpu", "1"), + "libvirt_domain."+randomResourceName, "vcpu.0.count", "1"), ), }, }, @@ -87,7 +87,9 @@ func TestAccLibvirtDomain_Detailed(t *testing.T) { resource "libvirt_domain" "%s" { name = "%s" memory = 384 - vcpu = 2 + vcpu { + count = 2 + } }`, randomResourceName, randomDomainName), Check: resource.ComposeTestCheckFunc( testAccCheckLibvirtDomainExists("libvirt_domain."+randomResourceName, &domain), @@ -96,7 +98,7 @@ func TestAccLibvirtDomain_Detailed(t *testing.T) { resource.TestCheckResourceAttr( "libvirt_domain."+randomResourceName, "memory", "384"), resource.TestCheckResourceAttr( - "libvirt_domain."+randomResourceName, "vcpu", "2"), + "libvirt_domain."+randomResourceName, "vcpu.0.count", "2"), ), }, }, @@ -1431,12 +1433,16 @@ func TestAccLibvirtDomain_ShutoffMultiDomainsRunning(t *testing.T) { Config: ` resource "libvirt_domain" "domainoff" { name = "domainfalse" - vcpu = 1 + vcpu { + count = 1 + } running = false } resource "libvirt_domain" "domainok" { name = "domaintrue" - vcpu = 1 + vcpu { + count = 1 + } running = true }`, Check: resource.ComposeTestCheckFunc( @@ -1526,7 +1532,9 @@ func TestAccLibvirtDomain_Import(t *testing.T) { resource "libvirt_domain" "%s" { name = "%s" memory = 384 - vcpu = 2 + vcpu { + count = 2 + } }`, randomDomainName, randomDomainName), }, { @@ -1539,7 +1547,7 @@ func TestAccLibvirtDomain_Import(t *testing.T) { resource.TestCheckResourceAttr( "libvirt_domain.%s-2", "memory", "384"), resource.TestCheckResourceAttr( - "libvirt_domain.%s-2", "vcpu", "2"), + "libvirt_domain.%s-2", "vcpu.0.count", "2"), ), }, },