diff --git a/app/models/manageiq/providers/openstack/cloud_manager/vm/operations/relocation.rb b/app/models/manageiq/providers/openstack/cloud_manager/vm/operations/relocation.rb index 79134414029..218cb65b239 100644 --- a/app/models/manageiq/providers/openstack/cloud_manager/vm/operations/relocation.rb +++ b/app/models/manageiq/providers/openstack/cloud_manager/vm/operations/relocation.rb @@ -1,6 +1,8 @@ module ManageIQ::Providers::Openstack::CloudManager::Vm::Operations::Relocation extend ActiveSupport::Concern + include ManageIQ::Providers::Openstack::HelperMethods + included do supports :live_migrate do unsupported_reason_add(:live_migrate, unsupported_reason(:control)) unless supports_control? @@ -18,7 +20,15 @@ def raw_live_migrate(options = {}) block_migration = options[:block_migration] || false disk_over_commit = options[:disk_over_commit] || false with_provider_connection do |connection| - connection.live_migrate_server(ems_ref, hostname, block_migration, disk_over_commit) + begin + connection.live_migrate_server(ems_ref, hostname, block_migration, disk_over_commit) + rescue => ex + error_message = parse_error_message_from_fog_response(ex.to_s) + Notification.create(:type => :vm_cloud_live_migrate_error, :options => {:instance_name => name, :error_message => error_message}) + raise + else + Notification.create(:type => :vm_cloud_live_migrate_success, :options => {:instance_name => name}) + end end # Temporarily update state for quick UI response until refresh comes along self.update_attributes!(:raw_power_state => "MIGRATING") @@ -31,7 +41,15 @@ def raw_evacuate(options = {}) on_shared_storage = true if on_shared_storage.nil? admin_password = options[:admin_password] with_provider_connection do |connection| - connection.evacuate_server(ems_ref, hostname, on_shared_storage, admin_password) + begin + connection.evacuate_server(ems_ref, hostname, on_shared_storage, admin_password) + rescue => ex + error_message = parse_error_message_from_fog_response(ex.to_s) + Notification.create(:type => :vm_cloud_evacuate_error, :options => {:instance_name => name, :error_message => error_message}) + raise + else + Notification.create(:type => :vm_cloud_evacuate_success, :options => {:instance_name => name}) + end end # Temporarily update state for quick UI response until refresh comes along self.update_attributes!(:raw_power_state => "MIGRATING") diff --git a/app/models/manageiq/providers/openstack/helper_methods.rb b/app/models/manageiq/providers/openstack/helper_methods.rb new file mode 100644 index 00000000000..dec71ea3d2c --- /dev/null +++ b/app/models/manageiq/providers/openstack/helper_methods.rb @@ -0,0 +1,7 @@ +module ManageIQ::Providers::Openstack::HelperMethods + def parse_error_message_from_fog_response(exception) + exception_string = exception.to_s + matched_message = exception_string.match(/message\\\": \\\"(.*)\\\", /) + matched_message ? matched_message[1] : exception_string + end +end diff --git a/db/fixtures/notification_types.yml b/db/fixtures/notification_types.yml index e50f3010594..336c55219b5 100644 --- a/db/fixtures/notification_types.yml +++ b/db/fixtures/notification_types.yml @@ -119,3 +119,23 @@ :expires_in: 24.hours :level: :info :audience: superadmin +- :name: vm_cloud_live_migrate_success + :message: 'Live migrating Instance %{instance_name} completed successfully.' + :expires_in: 24.hours + :audience: global + :level: :success +- :name: vm_cloud_live_migrate_error + :message: 'Live migrating Instance %{instance_name} failed: %{error_message}' + :expires_in: 24.hours + :level: :error + :audience: global +- :name: vm_cloud_evacuate_success + :message: 'Evacuating Instance %{instance_name} completed successfully.' + :expires_in: 24.hours + :audience: global + :level: :success +- :name: vm_cloud_evacuate_error + :message: 'Evacuating Instance %{instance_name} failed: %{error_message}' + :expires_in: 24.hours + :level: :error + :audience: global diff --git a/spec/models/manageiq/providers/openstack/cloud_manager/vm_spec.rb b/spec/models/manageiq/providers/openstack/cloud_manager/vm_spec.rb index bda58ea9f27..26a5d34583c 100644 --- a/spec/models/manageiq/providers/openstack/cloud_manager/vm_spec.rb +++ b/spec/models/manageiq/providers/openstack/cloud_manager/vm_spec.rb @@ -48,6 +48,10 @@ describe "vm actions" do context "#live_migrate" do + before do + NotificationType.seed + end + it "live migrates with default options" do expect(handle).to receive(:live_migrate_server).with(vm.ems_ref, nil, false, false) vm.live_migrate @@ -66,6 +70,10 @@ end context "evacuate" do + before do + NotificationType.seed + end + it "evacuates with default options" do expect(handle).to receive(:evacuate_server).with(vm.ems_ref, nil, true, nil) vm.evacuate