diff --git a/docs/resources/vm.md b/docs/resources/vm.md index 8ab92365..88d9e943 100644 --- a/docs/resources/vm.md +++ b/docs/resources/vm.md @@ -74,6 +74,7 @@ Optional: - `format` (String) Disk format for the override. Can be 'raw' or 'cow'. - `provisioning` (String) Provisioning the disk. Must be one of sparse,non-sparse +- `storage_domain_id` (String) ID of the storage domain where the new disk will be placed. ## Import diff --git a/internal/ovirt/resource_ovirt_vm.go b/internal/ovirt/resource_ovirt_vm.go index bc95b8a3..5b63f35e 100644 --- a/internal/ovirt/resource_ovirt_vm.go +++ b/internal/ovirt/resource_ovirt_vm.go @@ -148,6 +148,13 @@ var vmSchema = map[string]*schema.Schema{ Description: fmt.Sprintf("Provisioning the disk. Must be one of %s", strings.Join(provisioningValues(), ",")), ValidateDiagFunc: validateEnum(provisioningValues()), }, + "storage_domain_id": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Description: "ID of the storage domain where the new disk will be placed.", + ValidateDiagFunc: validateUUID, + }, }, }, }, @@ -417,6 +424,14 @@ func handleTemplateDiskAttachmentOverride( return diags } } + if storageDomainID, ok := entry["storage_domain_id"]; ok && storageDomainID != "" { + storageDomainObj := ovirtclient.StorageDomainID(storageDomainID.(string)) + disk, err = disk.WithStorageDomainID(storageDomainObj) + if err != nil { + diags = append(diags, errorToDiag("set storage domain id", err)) + return diags + } + } disks[i] = disk } _, err := params.WithDisks(disks) diff --git a/internal/ovirt/resource_ovirt_vm_test.go b/internal/ovirt/resource_ovirt_vm_test.go index 67985864..1e10444a 100644 --- a/internal/ovirt/resource_ovirt_vm_test.go +++ b/internal/ovirt/resource_ovirt_vm_test.go @@ -683,6 +683,7 @@ func TestVMOverrideDisk(t *testing.T) { clusterID := testHelper.GetClusterID() templateID := testHelper.GetBlankTemplateID() storageDomainID := testHelper.GetStorageDomainID() + secondaryStorageDomainID := testHelper.GetSecondaryStorageDomainID(t) baseConfig := fmt.Sprintf( ` @@ -731,37 +732,54 @@ func TestVMOverrideDisk(t *testing.T) { template_id = ovirt_template.source.id cluster_id = "%s" name = "%s" + clone = true dynamic "template_disk_attachment_override" { for_each = data.ovirt_template_disk_attachments.source.disk_attachments content { - disk_id = template_disk_attachment_override.value["disk_id"] - format = %s - provisioning = %s + disk_id = template_disk_attachment_override.value["disk_id"] + format = %s + provisioning = %s + storage_domain_id = %s } } }` testcases := []struct { - name string - inputFormat string - inputProvisioning string - expectedFormat ovirtclient.ImageFormat - expectedSparse bool + name string + inputFormat string + inputProvisioning string + inputStorageDomainID string + expectedFormat ovirtclient.ImageFormat + expectedSparse bool + expectedStorageDomainID string }{ { - name: "override sparse", - inputFormat: "null", - inputProvisioning: "\"sparse\"", - expectedFormat: ovirtclient.ImageFormatCow, - expectedSparse: true, + name: "override sparse", + inputFormat: "null", + inputProvisioning: "\"sparse\"", + inputStorageDomainID: "null", + expectedFormat: ovirtclient.ImageFormatCow, + expectedSparse: true, + expectedStorageDomainID: string(storageDomainID), }, { - name: "override format", - inputFormat: "\"raw\"", - inputProvisioning: "null", - expectedFormat: ovirtclient.ImageFormatRaw, - expectedSparse: false, + name: "override format", + inputFormat: "\"raw\"", + inputProvisioning: "null", + inputStorageDomainID: "null", + expectedFormat: ovirtclient.ImageFormatRaw, + expectedSparse: false, + expectedStorageDomainID: string(storageDomainID), + }, + { + name: "set storage_domain_id", + inputFormat: "null", + inputProvisioning: "null", + inputStorageDomainID: "\"" + string(secondaryStorageDomainID) + "\"", + expectedFormat: ovirtclient.ImageFormatCow, + expectedSparse: false, + expectedStorageDomainID: string(secondaryStorageDomainID), }, } @@ -772,6 +790,7 @@ func TestVMOverrideDisk(t *testing.T) { p.getTestHelper().GenerateTestResourceName(t), testcase.inputFormat, testcase.inputProvisioning, + testcase.inputStorageDomainID, ) resource.UnitTest( @@ -798,6 +817,10 @@ func TestVMOverrideDisk(t *testing.T) { if disk.Sparse() != testcase.expectedSparse { return fmt.Errorf("disk incorrectly created as sparse") } + storageDomainID := disk.StorageDomainIDs()[0] + if string(storageDomainID) != testcase.expectedStorageDomainID { + return fmt.Errorf("disk not created on correct storage domain") + } return nil }, },