diff --git a/plugins/module_utils/openstack/openstack.go b/plugins/module_utils/openstack/openstack.go index ca3aa9cb..a0165b5c 100644 --- a/plugins/module_utils/openstack/openstack.go +++ b/plugins/module_utils/openstack/openstack.go @@ -241,6 +241,23 @@ func IsVolumeConverted(client *gophercloud.ProviderClient, volumeID string) (boo return false, nil } +func IsVolumeReady(client *gophercloud.ProviderClient, volumeID string) (bool, error) { + blockStorageClient, err := openstack.NewBlockStorageV3(client, gophercloud.EndpointOpts{}) + if err != nil { + logger.Log.Infof("Failed to create block storage client: %v", err) + return false, err + } + volume, err := volumes.Get(context.TODO(), blockStorageClient, volumeID).Extract() + if err != nil { + logger.Log.Infof("Failed to get volume: %v", err) + return false, err + } + if state, ok := volume.Metadata["osm_state"]; ok { + return state == "ready", nil + } + return false, nil +} + func GetOSChangeID(client *gophercloud.ProviderClient, volumeID string) (string, error) { blockStorageClient, err := openstack.NewBlockStorageV3(client, gophercloud.EndpointOpts{}) if err != nil { diff --git a/plugins/modules/src/migrate/migrate.go b/plugins/modules/src/migrate/migrate.go index 0aa9c5eb..962bd283 100644 --- a/plugins/modules/src/migrate/migrate.go +++ b/plugins/modules/src/migrate/migrate.go @@ -159,6 +159,10 @@ func (c *MigrationConfig) VMMigration(parentCtx context.Context, runV2V bool) (s logger.Log.Infof("Volume already converted, skipping migration..") return volume.ID, nil } + if state, ok := volume.Metadata["osm_state"]; ok && state == "ready" { + logger.Log.Infof("Volume already migrated and ready to be used by OpenStack, skipping...") + return volume.ID, nil + } if c.CBTSync { logger.Log.Infof("Volume exists, syncing volume..") syncVol = true @@ -381,7 +385,15 @@ func (c *MigrationConfig) VMMigration(parentCtx context.Context, runV2V bool) (s logger.Log.Infof("Failed to set volume metadata: %v, ignoring ...", err) } } else { - logger.Log.Infof("Skipping V2V conversion...") + logger.Log.Infof("Skipping V2V conversion...") + volMetadata = map[string]string{ + "osm": "true", + "osm_state": "ready", + } + err = osm_os.UpdateVolumeMetadata(c.OSClient, volume.ID, volMetadata) + if err != nil { + logger.Log.Infof("Failed to set volume metadata: %v, ignoring ...", err) + } } } } diff --git a/plugins/modules/src/volume_metadata_info/volume_metadata_info.go b/plugins/modules/src/volume_metadata_info/volume_metadata_info.go index 7a1c3da4..5ea583de 100644 --- a/plugins/modules/src/volume_metadata_info/volume_metadata_info.go +++ b/plugins/modules/src/volume_metadata_info/volume_metadata_info.go @@ -99,6 +99,13 @@ func main() { response.Msg = "Failed to get volume metadata: " + moduleArgs.VolumeID + " error: " + err.Error() FailJson(response) } + if !converted { + converted, err = osm_os.IsVolumeReady(provider, moduleArgs.VolumeID) + if err != nil { + response.Msg = "Failed to get volume state: " + moduleArgs.VolumeID + " error: " + err.Error() + FailJson(response) + } + } response.Changed = true response.Msg = "Volume metadata info" response.Converted = converted