Skip to content

Commit

Permalink
Support moving a VM to another folder during VM Migrate.
Browse files Browse the repository at this point in the history
  • Loading branch information
lfu committed Jun 7, 2018
1 parent 5e454cb commit 100569b
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 7 deletions.
12 changes: 12 additions & 0 deletions app/models/ems_folder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,18 @@ def register_host(host)
end
end

def move_into_folder(vm)
raise _("Vm cannot be nil") if vm.nil?
vm_mor = vm.ems_ref_obj
log_header = "EmsFolder: [#{name}] Vm: id [#{vm.id}], name [#{vm.name}], ems_ref [#{vm_mor}]"

with_provider_object do |vim_folder|
_log.info("#{log_header} Invoking moveIntoFolder...")
vim_folder.send(:moveIntoFolder, vm_mor)
_log.info("#{log_header} Invoking moveIntoFolder...Complete")
end
end

# Folder pathing methods
# TODO: Store the full path directly in the folder objects for performance reasons

Expand Down
17 changes: 12 additions & 5 deletions app/models/vm_migrate_task.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ def self.get_description(req_obj)
new_settings << "Host: #{host_name}" unless host_name.blank?
respool_name = req_obj.get_option_last(:placement_rp_name)
new_settings << "Resource Pool: #{respool_name}" unless respool_name.blank?
folder_name = req_obj.get_option_last(:placement_folder_name)
new_settings << "Folder: #{folder_name}" if folder_name.present?
storage = req_obj.get_option_last(:placement_ds_name)
new_settings << "Storage: #{storage}" unless storage.blank?
"#{request_class::TASK_DESCRIPTION} for: #{name} - #{new_settings.join(", ")}"
Expand All @@ -44,6 +46,9 @@ def do_request
respool_id = get_option(:placement_rp_name)
respool = ResourcePool.find_by(:id => respool_id)

folder_id = get_option(:placement_folder_name)
folder = EmsFolder.find_by(:id => folder_id)

datastore_id = get_option(:placement_ds_name)
datastore = Storage.find_by(:id => datastore_id)

Expand All @@ -57,7 +62,7 @@ def do_request
:relocate
elsif respool && host.nil?
:relocate
else
elsif host
:migrate
end

Expand All @@ -66,18 +71,20 @@ def do_request
begin
if vc_method == :migrate
vm.migrate(host, respool)
else
elsif vc_method == :relocate
vm.relocate(host, respool, datastore, nil, disk_transform)
end

folder.move_into_folder(vm) if folder.present?
rescue => err
update_and_notify_parent(:state => 'finished', :status => 'error', :message => "Failed. Reason[#{err.message}]")
update_and_notify_parent(:state => 'finished', :status => 'Error', :message => "Failed. Reason[#{err.message}]")
return
end

if AUTOMATE_DRIVES
update_and_notify_parent(:state => 'migrated', :message => "Finished #{request_class::TASK_DESCRIPTION}")
update_and_notify_parent(:state => 'migrated', :message => "Finished #{request_class::TASK_DESCRIPTION}", :status => 'Ok')
else
update_and_notify_parent(:state => 'finished', :message => "#{request_class::TASK_DESCRIPTION} complete")
update_and_notify_parent(:state => 'finished', :message => "#{request_class::TASK_DESCRIPTION} complete", :status => 'Ok')
end
end
end
8 changes: 8 additions & 0 deletions product/dialogs/miq_dialogs/vm_migrate_dialogs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,14 @@
:required: false
:display: :edit
:data_type: :integer
:placement_folder_name:
:values_from:
:method: :allowed_folders
:auto_select_single: false
:description: Name
:required: false
:display: :edit
:data_type: :integer
:display: :show
:schedule:
:description: Schedule
Expand Down
14 changes: 14 additions & 0 deletions spec/models/ems_folder_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,18 @@
expect(@root.child_folder_paths).to eq(expected)
end
end

describe "#move_into_folder" do
let(:folder) { FactoryGirl.create(:ems_folder) }
let(:vm) { FactoryGirl.create(:vm_vmware, :ems_ref_obj => "vm-1120") }
let(:provider_object) do
double("vm_vmware_provider_object", :destroy => nil).as_null_object
end

it "calls provider's method" do
expect(folder).to receive(:with_provider_object).and_yield(provider_object)
expect(provider_object).to receive(:send).with(:moveIntoFolder, vm.ems_ref_obj)
folder.move_into_folder(vm)
end
end
end
9 changes: 7 additions & 2 deletions spec/models/vm_migrate_task_spec.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
describe VmMigrateTask do
describe '.do_request' do
let(:vm) { Vm.new }
before { subject.vm = vm }
before do
subject.vm = vm
host = FactoryGirl.create(:host, :name => "test")
options = {:placement_host_name => [host.id, host.name] }
subject.update_attributes(:options => options)
end

it 'migrates the vm and updates the status' do
expect(vm).to receive(:migrate)
Expand All @@ -11,7 +16,7 @@

it 'catches migrate error and update the status' do
expect(vm).to receive(:migrate).and_raise("Bad things happened")
expect(subject).to receive(:update_and_notify_parent).with(hash_including(:state => 'finished', :status => 'error', :message => 'Failed. Reason[Bad things happened]'))
expect(subject).to receive(:update_and_notify_parent).with(hash_including(:state => 'finished', :status => 'Error', :message => 'Failed. Reason[Bad things happened]'))
subject.do_request
end
end
Expand Down

0 comments on commit 100569b

Please sign in to comment.