diff --git a/README.md b/README.md index 4415f18..8068d14 100644 --- a/README.md +++ b/README.md @@ -135,8 +135,8 @@ func TestSomething(t *testing.T) { params := ovirtclient.TestHelperParams(). WithClusterID(ovirtclient.ClusterID(os.Getenv("OVIRT_CLUSTER_ID"))). WithBlankTemplateID(ovirtclient.TemplateID(os.Getenv("OVIRT_BLANK_TEMPLATE_ID"))). - WithStorageDomainID(os.Getenv("OVIRT_STORAGE_DOMAIN_ID")). - WithSecondaryStorageDomainID(os.Getenv("OVIRT_SECONDARY_STORAGE_DOMAIN_ID")). + WithStorageDomainID(ovirtclient.StorageDomainID(os.Getenv("OVIRT_STORAGE_DOMAIN_ID"))). + WithSecondaryStorageDomainID(ovirtclient.StorageDomainID(os.Getenv("OVIRT_SECONDARY_STORAGE_DOMAIN_ID"))). WithVNICProfileID(os.Getenv("OVIRT_VNIC_PROFILE_ID")) // Create the test helper diff --git a/disk.go b/disk.go index d262c23..f04bba2 100644 --- a/disk.go +++ b/disk.go @@ -41,7 +41,7 @@ type DiskClient interface { // Deprecated: Use StartUploadToNewDisk instead. StartImageUpload( alias string, - storageDomainID string, + storageDomainID StorageDomainID, sparse bool, size uint64, reader io.ReadSeekCloser, @@ -75,7 +75,7 @@ type DiskClient interface { // //... // } StartUploadToNewDisk( - storageDomainID string, + storageDomainID StorageDomainID, format ImageFormat, size uint64, params CreateDiskOptionalParameters, @@ -89,7 +89,7 @@ type DiskClient interface { // Deprecated: Use UploadToNewDisk instead. UploadImage( alias string, - storageDomainID string, + storageDomainID StorageDomainID, sparse bool, size uint64, reader io.ReadSeekCloser, @@ -99,7 +99,7 @@ type DiskClient interface { // UploadToNewDisk is identical to StartUploadToNewDisk, but waits until the upload is complete. It // returns the disk ID as a result, or the error if one happened. UploadToNewDisk( - storageDomainID string, + storageDomainID StorageDomainID, format ImageFormat, size uint64, params CreateDiskOptionalParameters, @@ -204,7 +204,7 @@ type DiskClient interface { // StartCreateDisk starts creating an empty disk with the specified parameters and returns a DiskCreation object, // which can be queried for completion. Optional parameters can be created using CreateDiskParams(). StartCreateDisk( - storageDomainID string, + storageDomainID StorageDomainID, format ImageFormat, size uint64, params CreateDiskOptionalParameters, @@ -218,7 +218,7 @@ type DiskClient interface { // the ready state. Since the disk is almost certainly in a locked state, this may mean that there is a disk left // behind. CreateDisk( - storageDomainID string, + storageDomainID StorageDomainID, format ImageFormat, size uint64, params CreateDiskOptionalParameters, @@ -465,7 +465,7 @@ type DiskData interface { // StorageDomainIDs returns a list of storage domains this disk is present on. This will typically be a single // disk, but may have multiple disk when the disk has been copied over to other storage domains. The disk is always // present on at least one disk, so this list will never be empty. - StorageDomainIDs() []string + StorageDomainIDs() []StorageDomainID // Status returns the status the disk is in. Status() DiskStatus // Sparse indicates sparse provisioning on the disk. @@ -640,15 +640,15 @@ func convertSDKDisk(sdkDisk *ovirtsdk4.Disk, client Client) (Disk, error) { if !ok { return nil, newError(EFieldMissing, "disk does not contain an ID") } - var storageDomainIDs []string + var storageDomainIDs []StorageDomainID if sdkStorageDomain, ok := sdkDisk.StorageDomain(); ok { storageDomainID, _ := sdkStorageDomain.Id() - storageDomainIDs = append(storageDomainIDs, storageDomainID) + storageDomainIDs = append(storageDomainIDs, StorageDomainID(storageDomainID)) } if sdkStorageDomains, ok := sdkDisk.StorageDomains(); ok { for _, sd := range sdkStorageDomains.Slice() { storageDomainID, _ := sd.Id() - storageDomainIDs = append(storageDomainIDs, storageDomainID) + storageDomainIDs = append(storageDomainIDs, StorageDomainID(storageDomainID)) } } if len(storageDomainIDs) == 0 { @@ -699,7 +699,7 @@ type disk struct { alias string provisionedSize uint64 format ImageFormat - storageDomainIDs []string + storageDomainIDs []StorageDomainID status DiskStatus totalSize uint64 sparse bool @@ -709,7 +709,7 @@ func (d *disk) WaitForOK(retries ...RetryStrategy) (Disk, error) { return d.client.WaitForDiskOK(d.id, retries...) } -func (d *disk) StorageDomainIDs() []string { +func (d *disk) StorageDomainIDs() []StorageDomainID { return d.storageDomainIDs } diff --git a/disk_create.go b/disk_create.go index 955043d..12faefe 100644 --- a/disk_create.go +++ b/disk_create.go @@ -8,7 +8,7 @@ import ( ) func (o *oVirtClient) StartCreateDisk( - storageDomainID string, + storageDomainID StorageDomainID, format ImageFormat, size uint64, params CreateDiskOptionalParameters, @@ -78,7 +78,7 @@ func validateDiskCreationParameters(format ImageFormat, size uint64) error { } func (o *oVirtClient) createDisk( - storageDomainID string, + storageDomainID StorageDomainID, size uint64, format ImageFormat, correlationID string, @@ -102,12 +102,12 @@ func (o *oVirtClient) createDisk( } func (o *oVirtClient) buildDiskObjectForCreation( - storageDomainID string, + storageDomainID StorageDomainID, size uint64, format ImageFormat, params CreateDiskOptionalParameters, ) (*ovirtsdk4.Disk, error) { - storageDomain, err := ovirtsdk4.NewStorageDomainBuilder().Id(storageDomainID).Build() + storageDomain, err := ovirtsdk4.NewStorageDomainBuilder().Id(string(storageDomainID)).Build() if err != nil { return nil, wrap( err, @@ -133,7 +133,7 @@ func (o *oVirtClient) buildDiskObjectForCreation( } func (o *oVirtClient) CreateDisk( - storageDomainID string, + storageDomainID StorageDomainID, format ImageFormat, size uint64, params CreateDiskOptionalParameters, diff --git a/disk_create_mock.go b/disk_create_mock.go index 0bfef12..9edf672 100644 --- a/disk_create_mock.go +++ b/disk_create_mock.go @@ -6,7 +6,7 @@ import ( ) func (m *mockClient) StartCreateDisk( - storageDomainID string, + storageDomainID StorageDomainID, format ImageFormat, size uint64, params CreateDiskOptionalParameters, @@ -30,7 +30,7 @@ func (m *mockClient) StartCreateDisk( } func (m *mockClient) createDisk( - storageDomainID string, + storageDomainID StorageDomainID, format ImageFormat, size uint64, params CreateDiskOptionalParameters, @@ -50,7 +50,7 @@ func (m *mockClient) createDisk( format: format, provisionedSize: size, totalSize: size, - storageDomainIDs: []string{storageDomainID}, + storageDomainIDs: []StorageDomainID{storageDomainID}, status: DiskStatusLocked, }, lock: &sync.Mutex{}, @@ -72,7 +72,7 @@ func (m *mockClient) createDisk( } func (m *mockClient) CreateDisk( - storageDomainID string, + storageDomainID StorageDomainID, format ImageFormat, size uint64, params CreateDiskOptionalParameters, diff --git a/disk_uploadimage.go b/disk_uploadimage.go index 27ec99b..55b14ac 100644 --- a/disk_uploadimage.go +++ b/disk_uploadimage.go @@ -18,7 +18,7 @@ import ( // Deprecated: use UploadToNewDisk instead. func (o *oVirtClient) UploadImage( alias string, - storageDomainID string, + storageDomainID StorageDomainID, sparse bool, size uint64, reader io.ReadSeekCloser, @@ -36,7 +36,7 @@ func (o *oVirtClient) UploadImage( } func (o *oVirtClient) UploadToNewDisk( - storageDomainID string, + storageDomainID StorageDomainID, format ImageFormat, size uint64, params CreateDiskOptionalParameters, @@ -58,7 +58,7 @@ func (o *oVirtClient) UploadToNewDisk( // Deprecated: use StartUploadToNewDisk instead. func (o *oVirtClient) StartImageUpload( alias string, - storageDomainID string, + storageDomainID StorageDomainID, sparse bool, size uint64, reader io.ReadSeekCloser, @@ -296,7 +296,7 @@ func (u *uploadToDiskProgress) Read(p []byte) (n int, err error) { } func (o *oVirtClient) StartUploadToNewDisk( - storageDomainID string, + storageDomainID StorageDomainID, format ImageFormat, size uint64, params CreateDiskOptionalParameters, @@ -348,7 +348,7 @@ func (o *oVirtClient) StartUploadToNewDisk( type uploadToNewDiskProgress struct { uploadToDiskProgress - storageDomainID string + storageDomainID StorageDomainID diskFormat ImageFormat diskParams CreateDiskOptionalParameters } @@ -399,7 +399,7 @@ func (u *uploadToNewDiskProgress) Do() { func (m *mockClient) StartImageUpload( alias string, - storageDomainID string, + storageDomainID StorageDomainID, sparse bool, size uint64, reader io.ReadSeekCloser, @@ -417,7 +417,7 @@ func (m *mockClient) StartImageUpload( func (m *mockClient) UploadImage( alias string, - storageDomainID string, + storageDomainID StorageDomainID, sparse bool, size uint64, reader io.ReadSeekCloser, @@ -498,7 +498,7 @@ func (m *mockClient) UploadToDisk(diskID string, size uint64, reader io.ReadSeek } func (m *mockClient) StartUploadToNewDisk( - storageDomainID string, + storageDomainID StorageDomainID, format ImageFormat, size uint64, params CreateDiskOptionalParameters, @@ -558,7 +558,7 @@ func (m *mockClient) StartUploadToNewDisk( } func (m *mockClient) UploadToNewDisk( - storageDomainID string, + storageDomainID StorageDomainID, format ImageFormat, size uint64, params CreateDiskOptionalParameters, diff --git a/mock.go b/mock.go index 7e15dae..b2d180d 100644 --- a/mock.go +++ b/mock.go @@ -25,7 +25,7 @@ type mockClient struct { lock *sync.Mutex nonSecureRandom *rand.Rand vms map[VMID]*vm - storageDomains map[string]*storageDomain + storageDomains map[StorageDomainID]*storageDomain disks map[string]*diskWithData clusters map[ClusterID]*cluster hosts map[string]*host diff --git a/newmock.go b/newmock.go index 27b2f49..e465025 100644 --- a/newmock.go +++ b/newmock.go @@ -84,7 +84,7 @@ func getClient( vms: map[VMID]*vm{}, tags: map[string]*tag{}, nonSecureRandom: rand.New(rand.NewSource(time.Now().UnixNano())), //nolint:gosec - storageDomains: map[string]*storageDomain{ + storageDomains: map[StorageDomainID]*storageDomain{ testStorageDomain.ID(): testStorageDomain, secondaryStorageDomain.ID(): secondaryStorageDomain, }, @@ -185,7 +185,7 @@ func generateTestDatacenter(testCluster *cluster) *datacenterWithClusters { func generateTestStorageDomain() *storageDomain { return &storageDomain{ - id: uuid.NewString(), + id: StorageDomainID(uuid.NewString()), name: "Test storage domain", available: 10 * 1024 * 1024 * 1024, status: StorageDomainStatusActive, diff --git a/storagedomain.go b/storagedomain.go index de771f5..3113751 100644 --- a/storagedomain.go +++ b/storagedomain.go @@ -7,25 +7,28 @@ import ( ovirtsdk4 "github.com/ovirt/go-ovirt" ) -//go:generate go run scripts/rest/rest.go -i "StorageDomain" -n "storage domain" +//go:generate go run scripts/rest/rest.go -i "StorageDomain" -n "storage domain" -T StorageDomainID + +// StorageDomainID is a specialized type for storage domain IDs. +type StorageDomainID string // StorageDomainClient contains the portion of the goVirt API that deals with storage domains. type StorageDomainClient interface { // ListStorageDomains lists all storage domains. ListStorageDomains(retries ...RetryStrategy) ([]StorageDomain, error) // GetStorageDomain returns a single storage domain, or an error if the storage domain could not be found. - GetStorageDomain(id string, retries ...RetryStrategy) (StorageDomain, error) + GetStorageDomain(id StorageDomainID, retries ...RetryStrategy) (StorageDomain, error) // GetDiskFromStorageDomain returns a single disk from a specific storage domain, or an error if no disk can be found. - GetDiskFromStorageDomain(id string, diskID string, retries ...RetryStrategy) (result Disk, err error) + GetDiskFromStorageDomain(id StorageDomainID, diskID string, retries ...RetryStrategy) (result Disk, err error) // RemoveDiskFromStorageDomain removes a disk from a specific storage domain, but leaves the disk on other storage // domains if any. If the disk is not present on any more storage domains, the entire disk will be removed. - RemoveDiskFromStorageDomain(id string, diskID string, retries ...RetryStrategy) error + RemoveDiskFromStorageDomain(id StorageDomainID, diskID string, retries ...RetryStrategy) error } // StorageDomainData is the core of StorageDomain, providing only data access functions. type StorageDomainData interface { // ID is the unique identified for the storage system connected to oVirt. - ID() string + ID() StorageDomainID // Name is the user-given name for the storage domain. Name() string // Available returns the number of available bytes on the storage domain @@ -263,7 +266,7 @@ func convertSDKStorageDomain(sdkStorageDomain *ovirtsdk4.StorageDomain, client C return &storageDomain{ client: client, - id: id, + id: StorageDomainID(id), name: name, available: uint64(available), storageType: StorageDomainType(storageType), @@ -275,7 +278,7 @@ func convertSDKStorageDomain(sdkStorageDomain *ovirtsdk4.StorageDomain, client C type storageDomain struct { client Client - id string + id StorageDomainID name string available uint64 storageType StorageDomainType @@ -283,7 +286,7 @@ type storageDomain struct { externalStatus StorageDomainExternalStatus } -func (s storageDomain) ID() string { +func (s storageDomain) ID() StorageDomainID { return s.id } diff --git a/storagedomain_get.go b/storagedomain_get.go index ad5ecf1..2a160dd 100644 --- a/storagedomain_get.go +++ b/storagedomain_get.go @@ -6,14 +6,14 @@ import ( "fmt" ) -func (o *oVirtClient) GetStorageDomain(id string, retries ...RetryStrategy) (result StorageDomain, err error) { +func (o *oVirtClient) GetStorageDomain(id StorageDomainID, retries ...RetryStrategy) (result StorageDomain, err error) { retries = defaultRetries(retries, defaultReadTimeouts(o)) err = retry( fmt.Sprintf("getting storage domain %s", id), o.logger, retries, func() error { - response, err := o.conn.SystemService().StorageDomainsService().StorageDomainService(id).Get().Send() + response, err := o.conn.SystemService().StorageDomainsService().StorageDomainService(string(id)).Get().Send() if err != nil { return err } @@ -39,7 +39,7 @@ func (o *oVirtClient) GetStorageDomain(id string, retries ...RetryStrategy) (res return } -func (m *mockClient) GetStorageDomain(id string, _ ...RetryStrategy) (StorageDomain, error) { +func (m *mockClient) GetStorageDomain(id StorageDomainID, _ ...RetryStrategy) (StorageDomain, error) { m.lock.Lock() defer m.lock.Unlock() if item, ok := m.storageDomains[id]; ok { diff --git a/storagedomain_get_disk.go b/storagedomain_get_disk.go index 36d83d7..f5f4bd5 100644 --- a/storagedomain_get_disk.go +++ b/storagedomain_get_disk.go @@ -4,7 +4,7 @@ import ( "fmt" ) -func (o *oVirtClient) GetDiskFromStorageDomain(id string, diskID string, retries ...RetryStrategy) (result Disk, err error) { +func (o *oVirtClient) GetDiskFromStorageDomain(id StorageDomainID, diskID string, retries ...RetryStrategy) (result Disk, err error) { retries = defaultRetries(retries, defaultReadTimeouts(o)) err = retry( fmt.Sprintf("getting disk %s from storage domain %s", diskID, id), @@ -12,7 +12,7 @@ func (o *oVirtClient) GetDiskFromStorageDomain(id string, diskID string, retries retries, func() error { response, err := o.conn.SystemService().StorageDomainsService(). - StorageDomainService(id).DisksService().DiskService(diskID).Get().Send() + StorageDomainService(string(id)).DisksService().DiskService(diskID).Get().Send() if err != nil { return err } @@ -39,7 +39,7 @@ func (o *oVirtClient) GetDiskFromStorageDomain(id string, diskID string, retries return result, err } -func (m *mockClient) GetDiskFromStorageDomain(id string, diskID string, _ ...RetryStrategy) (Disk, error) { +func (m *mockClient) GetDiskFromStorageDomain(id StorageDomainID, diskID string, _ ...RetryStrategy) (Disk, error) { m.lock.Lock() defer m.lock.Unlock() if disk, ok := m.disks[diskID]; ok { diff --git a/storagedomain_remove_disk.go b/storagedomain_remove_disk.go index 9568609..b972b1c 100644 --- a/storagedomain_remove_disk.go +++ b/storagedomain_remove_disk.go @@ -4,7 +4,7 @@ import ( "fmt" ) -func (o *oVirtClient) RemoveDiskFromStorageDomain(id string, diskID string, retries ...RetryStrategy) (err error) { +func (o *oVirtClient) RemoveDiskFromStorageDomain(id StorageDomainID, diskID string, retries ...RetryStrategy) (err error) { retries = defaultRetries(retries, defaultReadTimeouts(o)) err = retry( fmt.Sprintf("removing disk %s from storage domain %s", diskID, id), @@ -12,7 +12,7 @@ func (o *oVirtClient) RemoveDiskFromStorageDomain(id string, diskID string, retr retries, func() error { _, err := o.conn.SystemService().StorageDomainsService(). - StorageDomainService(id).DisksService().DiskService(diskID).Remove().Send() + StorageDomainService(string(id)).DisksService().DiskService(diskID).Remove().Send() if err != nil { o.logger.Infof("error removing disk..") return err @@ -23,7 +23,7 @@ func (o *oVirtClient) RemoveDiskFromStorageDomain(id string, diskID string, retr return } -func (m *mockClient) RemoveDiskFromStorageDomain(id string, diskID string, _ ...RetryStrategy) error { +func (m *mockClient) RemoveDiskFromStorageDomain(id StorageDomainID, diskID string, _ ...RetryStrategy) error { m.lock.Lock() defer m.lock.Unlock() diff --git a/template.go b/template.go index 580acfb..7f3b003 100644 --- a/template.go +++ b/template.go @@ -27,7 +27,7 @@ type TemplateClient interface { // WaitForTemplateStatus waits for a template to enter a specific status. WaitForTemplateStatus(templateID TemplateID, status TemplateStatus, retries ...RetryStrategy) (Template, error) // CopyTemplateDiskToStorageDomain copies template disk to the specified storage domain. - CopyTemplateDiskToStorageDomain(diskID string, storageDomainID string, retries ...RetryStrategy) (Disk, error) + CopyTemplateDiskToStorageDomain(diskID string, storageDomainID StorageDomainID, retries ...RetryStrategy) (Disk, error) } // TemplateID is an identifier for a template. It has a special type so the compiler diff --git a/template_copy_disk.go b/template_copy_disk.go index c64a396..e7a987f 100644 --- a/template_copy_disk.go +++ b/template_copy_disk.go @@ -10,7 +10,7 @@ import ( func (o *oVirtClient) CopyTemplateDiskToStorageDomain( diskID string, - storageDomainID string, + storageDomainID StorageDomainID, retries ...RetryStrategy) (result Disk, err error) { retries = defaultRetries(retries, defaultReadTimeouts(o)) progress, err := o.StartCopyTemplateDiskToStorageDomain(diskID, storageDomainID, retries...) @@ -23,11 +23,11 @@ func (o *oVirtClient) CopyTemplateDiskToStorageDomain( func (o *oVirtClient) StartCopyTemplateDiskToStorageDomain( diskID string, - storageDomainID string, + storageDomainID StorageDomainID, retries ...RetryStrategy) (DiskUpdate, error) { retries = defaultRetries(retries, defaultWriteTimeouts(o)) correlationID := fmt.Sprintf("template_disk_copy_%s", generateRandomID(5, o.nonSecureRandom)) - sdkStorageDomain := ovirtsdk.NewStorageDomainBuilder().Id(storageDomainID) + sdkStorageDomain := ovirtsdk.NewStorageDomainBuilder().Id(string(storageDomainID)) sdkDisk := ovirtsdk.NewDiskBuilder().Id(diskID) storageDomain, _ := o.GetStorageDomain(storageDomainID) disk, _ := o.GetDisk(diskID) @@ -68,7 +68,7 @@ func (o *oVirtClient) StartCopyTemplateDiskToStorageDomain( func (m *mockClient) CopyTemplateDiskToStorageDomain( diskID string, - storageDomainID string, + storageDomainID StorageDomainID, retries ...RetryStrategy) (result Disk, err error) { m.lock.Lock() defer m.lock.Unlock() @@ -93,7 +93,7 @@ func (m *mockClient) CopyTemplateDiskToStorageDomain( type mockDiskCopy struct { client *mockClient disk *diskWithData - storageDomainID string + storageDomainID StorageDomainID done chan struct{} } diff --git a/template_test.go b/template_test.go index 62f3293..923c15c 100644 --- a/template_test.go +++ b/template_test.go @@ -170,7 +170,7 @@ func TestGetTemplateByName(t *testing.T) { } -func assertCanGetDiskFromStorageDomain(t *testing.T, helper ovirtclient.TestHelper, storageDomainID string, disk ovirtclient.Disk) ovirtclient.Disk { +func assertCanGetDiskFromStorageDomain(t *testing.T, helper ovirtclient.TestHelper, storageDomainID ovirtclient.StorageDomainID, disk ovirtclient.Disk) ovirtclient.Disk { newDisk, err := helper.GetClient().GetDiskFromStorageDomain(storageDomainID, disk.ID()) if err != nil { diff --git a/util_test_helper.go b/util_test_helper.go index eca4f80..41e8191 100644 --- a/util_test_helper.go +++ b/util_test_helper.go @@ -25,11 +25,11 @@ type TestHelper interface { GetBlankTemplateID() TemplateID // GetStorageDomainID returns the ID of the storage domain to create the images on. - GetStorageDomainID() string + GetStorageDomainID() StorageDomainID // GetSecondaryStorageDomainID returns a second ID of a storage domain to create images on. If no secondary // storage domain is available, the test will be skipped. - GetSecondaryStorageDomainID(t *testing.T) string + GetSecondaryStorageDomainID(t *testing.T) StorageDomainID // GenerateRandomID generates a random ID for testing. GenerateRandomID(length uint) string @@ -108,7 +108,7 @@ func NewTestHelper( return nil, err } - secondaryStorageDomainID, err := setupSecondaryStorageDomainID(params.StorageDomainID(), storageDomainID, client) + secondaryStorageDomainID, err := setupSecondaryStorageDomainID(params.SecondaryStorageDomainID(), storageDomainID, client) if err != nil { return nil, err } @@ -153,7 +153,11 @@ type TestHelperParameters interface { // StorageDomainID returns the storage domain ID usable for testing. It can return an empty // string if no test storage domain is designated for testing, in which case a working // storage domain is selected. - StorageDomainID() string + StorageDomainID() StorageDomainID + + // SecondaryStorageDomainID returns a second ID for a storage domain to test features that require + // two storage domains. This may be empty, in which case such tests should be skipped. + SecondaryStorageDomainID() StorageDomainID // BlankTemplateID returns an ID to a template that is blank and can be used as a basis // for testing. It may return an empty string if no template is provided. @@ -171,10 +175,10 @@ type BuildableTestHelperParameters interface { // WithClusterID sets the cluster ID usable for testing. WithClusterID(ClusterID) BuildableTestHelperParameters // WithStorageDomainID sets the storage domain that can be used for testing. - WithStorageDomainID(string) BuildableTestHelperParameters + WithStorageDomainID(StorageDomainID) BuildableTestHelperParameters // WithSecondaryStorageDomainID sets the storage domain that can be used for testing, which is not identical to // the primary storage domain ID. - WithSecondaryStorageDomainID(string) BuildableTestHelperParameters + WithSecondaryStorageDomainID(StorageDomainID) BuildableTestHelperParameters // WithBlankTemplateID sets the blank template that can be used for testing. WithBlankTemplateID(TemplateID) BuildableTestHelperParameters // WithVNICProfileID sets the ID of the VNIC profile that can be used for testing. @@ -183,13 +187,13 @@ type BuildableTestHelperParameters interface { type testHelperParameters struct { clusterID ClusterID - storageDomainID string - secondaryStorageDomainID string + storageDomainID StorageDomainID + secondaryStorageDomainID StorageDomainID blankTemplateID TemplateID vnicProfileID string } -func (t *testHelperParameters) WithSecondaryStorageDomainID(s string) BuildableTestHelperParameters { +func (t *testHelperParameters) WithSecondaryStorageDomainID(s StorageDomainID) BuildableTestHelperParameters { t.secondaryStorageDomainID = s return t } @@ -198,10 +202,14 @@ func (t *testHelperParameters) ClusterID() ClusterID { return t.clusterID } -func (t *testHelperParameters) StorageDomainID() string { +func (t *testHelperParameters) StorageDomainID() StorageDomainID { return t.storageDomainID } +func (t *testHelperParameters) SecondaryStorageDomainID() StorageDomainID { + return t.secondaryStorageDomainID +} + func (t *testHelperParameters) BlankTemplateID() TemplateID { return t.blankTemplateID } @@ -215,7 +223,7 @@ func (t *testHelperParameters) WithClusterID(s ClusterID) BuildableTestHelperPar return t } -func (t *testHelperParameters) WithStorageDomainID(s string) BuildableTestHelperParameters { +func (t *testHelperParameters) WithStorageDomainID(s StorageDomainID) BuildableTestHelperParameters { t.storageDomainID = s return t } @@ -274,7 +282,7 @@ func setupBlankTemplateID(blankTemplateID TemplateID, client Client) (id Templat return blankTemplateID, nil } -func setupTestStorageDomainID(storageDomainID string, client Client) (id string, err error) { +func setupTestStorageDomainID(storageDomainID StorageDomainID, client Client) (id StorageDomainID, err error) { if storageDomainID == "" { storageDomainID, err = findTestStorageDomainID("", client) if err != nil { @@ -287,10 +295,10 @@ func setupTestStorageDomainID(storageDomainID string, client Client) (id string, } func setupSecondaryStorageDomainID( - storageDomainID string, - skipStorageDomainID string, + storageDomainID StorageDomainID, + skipStorageDomainID StorageDomainID, client Client, -) (id string, err error) { +) (id StorageDomainID, err error) { if storageDomainID == "" { storageDomainID, err = findTestStorageDomainID(skipStorageDomainID, client) if err != nil && !errors.Is(err, errNoTestStorageDomainFound) { @@ -381,7 +389,7 @@ func verifyTestClusterID(client Client, clusterID ClusterID) error { var errNoTestStorageDomainFound = fmt.Errorf("failed to find a working storage domain for testing") -func findTestStorageDomainID(skipID string, client Client) (string, error) { +func findTestStorageDomainID(skipID StorageDomainID, client Client) (StorageDomainID, error) { storageDomains, err := client.ListStorageDomains() if err != nil { return "", err @@ -394,20 +402,22 @@ func findTestStorageDomainID(skipID string, client Client) (string, error) { if storageDomain.Available() < 2*1024*1024*1024 { continue } - if storageDomain.Status() == StorageDomainStatusActive { - return storageDomain.ID(), nil + if storageDomain.Status() != StorageDomainStatusActive && + (storageDomain.Status() != StorageDomainStatusNA || storageDomain.ExternalStatus() != StorageDomainExternalStatusOk) { + continue } - continue + return storageDomain.ID(), nil } return "", errNoTestStorageDomainFound } -func verifyTestStorageDomainID(client Client, storageDomainID string) error { +func verifyTestStorageDomainID(client Client, storageDomainID StorageDomainID) error { storageDomain, err := client.GetStorageDomain(storageDomainID) if err != nil { return err } - if storageDomain.Status() == StorageDomainStatusActive { + if storageDomain.Status() == StorageDomainStatusActive || + (storageDomain.Status() == StorageDomainStatusNA && storageDomain.ExternalStatus() == StorageDomainExternalStatusOk) { return nil } return fmt.Errorf("storage domain %s is %s, not active, external status is %s, not ok", storageDomain.ID(), storageDomain.Status(), storageDomain.ExternalStatus()) @@ -418,10 +428,10 @@ type testHelper struct { tls TLSProvider rand *rand.Rand clusterID ClusterID - storageDomainID string + storageDomainID StorageDomainID blankTemplateID TemplateID vnicProfileID string - secondaryStorageDomainID string + secondaryStorageDomainID StorageDomainID password string username string } @@ -438,7 +448,7 @@ func (t *testHelper) GetPassword() string { return t.password } -func (t *testHelper) GetSecondaryStorageDomainID(te *testing.T) string { +func (t *testHelper) GetSecondaryStorageDomainID(te *testing.T) StorageDomainID { if t.secondaryStorageDomainID == "" { te.Skipf("No secondary storage domain available, skipping test.") } @@ -465,7 +475,7 @@ func (t *testHelper) GetBlankTemplateID() TemplateID { return t.blankTemplateID } -func (t *testHelper) GetStorageDomainID() string { +func (t *testHelper) GetStorageDomainID() StorageDomainID { return t.storageDomainID } @@ -597,8 +607,8 @@ func NewLiveTestHelperFromEnv(logger ovirtclientlog.Logger) (TestHelper, error) params := TestHelperParams() params.WithClusterID(ClusterID(os.Getenv("OVIRT_CLUSTER_ID"))) params.WithBlankTemplateID(TemplateID(os.Getenv("OVIRT_BLANK_TEMPLATE_ID"))) - params.WithStorageDomainID(os.Getenv("OVIRT_STORAGE_DOMAIN_ID")) - params.WithSecondaryStorageDomainID(os.Getenv("OVIRT_SECONDARY_STORAGE_DOMAIN_ID")) + params.WithStorageDomainID(StorageDomainID(os.Getenv("OVIRT_STORAGE_DOMAIN_ID"))) + params.WithSecondaryStorageDomainID(StorageDomainID(os.Getenv("OVIRT_SECONDARY_STORAGE_DOMAIN_ID"))) params.WithVNICProfileID(os.Getenv("OVIRT_VNIC_PROFILE_ID")) helper, err := NewTestHelper( diff --git a/vm.go b/vm.go index f6512f6..099629f 100644 --- a/vm.go +++ b/vm.go @@ -1177,7 +1177,7 @@ type OptionalVMDiskParameters interface { // Format returns the image format to be used for the specified disk. Format() *ImageFormat // StorageDomainID returns the optional storage domain ID to use for this disk. - StorageDomainID() *string + StorageDomainID() *StorageDomainID } // BuildableVMDiskParameters is a buildable version of OptionalVMDiskParameters. @@ -1197,9 +1197,9 @@ type BuildableVMDiskParameters interface { MustWithFormat(format ImageFormat) BuildableVMDiskParameters // WithStorageDomainID adds a storage domain to use for the disk. - WithStorageDomainID(storageDomainID string) (BuildableVMDiskParameters, error) + WithStorageDomainID(storageDomainID StorageDomainID) (BuildableVMDiskParameters, error) // MustWithStorageDomainID is identical to WithStorageDomainID but panics instead of returning an error. - MustWithStorageDomainID(storageDomainID string) BuildableVMDiskParameters + MustWithStorageDomainID(storageDomainID StorageDomainID) BuildableVMDiskParameters } // NewBuildableVMDiskParameters creates a new buildable OptionalVMDiskParameters. @@ -1226,19 +1226,19 @@ type vmDiskParameters struct { diskID string sparse *bool format *ImageFormat - storageDomainID *string + storageDomainID *StorageDomainID } -func (v *vmDiskParameters) StorageDomainID() *string { +func (v *vmDiskParameters) StorageDomainID() *StorageDomainID { return v.storageDomainID } -func (v *vmDiskParameters) WithStorageDomainID(storageDomainID string) (BuildableVMDiskParameters, error) { +func (v *vmDiskParameters) WithStorageDomainID(storageDomainID StorageDomainID) (BuildableVMDiskParameters, error) { v.storageDomainID = &storageDomainID return v, nil } -func (v *vmDiskParameters) MustWithStorageDomainID(storageDomainID string) BuildableVMDiskParameters { +func (v *vmDiskParameters) MustWithStorageDomainID(storageDomainID StorageDomainID) BuildableVMDiskParameters { b, err := v.WithStorageDomainID(storageDomainID) if err != nil { panic(err) diff --git a/vm_create.go b/vm_create.go index 7983b5f..1f478c4 100644 --- a/vm_create.go +++ b/vm_create.go @@ -176,7 +176,7 @@ func createSDKVM( diskBuilder.Format(ovirtsdk.DiskFormat(*format)) } if storageDomainID := d.StorageDomainID(); storageDomainID != nil { - diskBuilder.StorageDomainsBuilderOfAny(*ovirtsdk.NewStorageDomainBuilder().Id(*storageDomainID)) + diskBuilder.StorageDomainsBuilderOfAny(*ovirtsdk.NewStorageDomainBuilder().Id(string(*storageDomainID))) } diskAttachment.DiskBuilder(diskBuilder) sdkDisk, err := diskAttachment.Build() @@ -494,11 +494,11 @@ func (m *mockClient) updateDiskParams( } if sd := diskParam.StorageDomainID(); sd != nil { if params.Clone() != nil && *params.Clone() { - disk.storageDomainIDs = []string{*sd} + disk.storageDomainIDs = []StorageDomainID{*sd} } else { for _, diskSD := range disk.storageDomainIDs { if diskSD == *sd { - disk.storageDomainIDs = []string{*sd} + disk.storageDomainIDs = []StorageDomainID{*sd} break } }