Skip to content

Commit

Permalink
Revert "Merge pull request #569 from fdupont-redhat/v2v_state_machine…
Browse files Browse the repository at this point in the history
…_transform_vm"

This reverts commit 35cf513.

https://bugzilla.redhat.com/show_bug.cgi?id=1767542
  • Loading branch information
simaishi committed Dec 3, 2019
1 parent 7998bd8 commit 1c76cd2
Show file tree
Hide file tree
Showing 7 changed files with 267 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
module ManageIQ
module Automate
module Transformation
module Common
class VMCheckTransformed
def initialize(handle = $evm)
@handle = handle
@task = ManageIQ::Automate::Transformation::Common::Utils.task(@handle)
end

def set_retry
@handle.root['ae_result'] = 'retry'
@handle.root['ae_retry_server_affinity'] = true
@handle.log(:info, "Disk transformation is not finished. Checking in #{@handle.root['ae_retry_interval']}")
end

def update_total_percentage
virtv2v_disks = @task[:options][:virtv2v_disks]
converted_disks = virtv2v_disks.reject { |d| d[:percent].zero? }
message, percent = nil, nil
if converted_disks.empty?
percent = 1
message = 'Disks transformation is initializing.'
else
percent = 0
converted_disks.each { |disk| percent += (disk[:percent].to_f * disk[:weight].to_f / 100.0) }
message = "Converting disk #{converted_disks.length} / #{virtv2v_disks.length} [#{percent.round(2)}%]."
end
[message, percent]
end

def main
@task.get_conversion_state
case @task.get_option(:virtv2v_status)
when 'active'
message, percent = update_total_percentage
@handle.set_state_var(:ae_state_progress, 'message' => message, 'percent' => percent.round(2))
set_retry
when 'failed'
message = @task.get_option(:virtv2v_message)
raise message
when 'succeeded'
@handle.set_state_var(:ae_state_progress, 'message' => 'Disks transformation succeeded.', 'percent' => 100)
end
rescue => e
if @handle.root['ae_state_retries'] > 1
@handle.set_state_var(:ae_state_progress, 'message' => e.message)
raise
else
set_retry
end
end
end
end
end
end
end

ManageIQ::Automate::Transformation::Common::VMCheckTransformed.new.main
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
object_type: method
version: 1.0
object:
attributes:
name: VMCheckTransformed
display_name:
description:
scope: instance
language: ruby
location: inline
embedded_methods:
- "/Transformation/Common/Utils"
options: {}
inputs: []
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
module ManageIQ
module Automate
module Transformation
module Common
class VMTransform
def initialize(handle = $evm)
@debug = false
@handle = handle
@task = ManageIQ::Automate::Transformation::Common::Utils.task(@handle)
end

def main
# WARNING: Enable at your own risk, as it may lead to sensitive data leak
# @handle.log(:info, "JSON Input:\n#{JSON.pretty_generate(@task.conversion_options)}") if @debug

@task.run_conversion
rescue => e
@handle.set_state_var(:ae_state_progress, 'message' => e.message)
raise
end
end
end
end
end
end

ManageIQ::Automate::Transformation::Common::VMTransform.new.main
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
object_type: method
version: 1.0
object:
attributes:
name: VMTransform
display_name:
description:
scope: instance
language: ruby
location: inline
embedded_methods:
- "/Transformation/Common/Utils"
options: {}
inputs: []
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,23 @@ object:
inherits:
description:
fields:
- State2:
value: "/Transformation/Common/VMTransform"
on_entry: /System/CommonMethods/MiqAe.WeightedUpdateStatus(weight => 5, description
=> "Convert disks", task_message => "Migrating")
on_exit: /System/CommonMethods/MiqAe.WeightedUpdateStatus(weight => 5, description
=> "Convert disks", task_message => "Migrating")
on_error: /System/CommonMethods/MiqAe.WeightedUpdateStatus(weight => 5, description
=> "Convert disks", task_message => "Migrating")
- State5:
value: "/Transformation/Common/VMCheckTransformed"
on_entry: /System/CommonMethods/MiqAe.WeightedUpdateStatus(weight => 80, description
=> "Convert disks", task_message => "Migrating")
on_exit: /System/CommonMethods/MiqAe.WeightedUpdateStatus(weight => 80, description
=> "Convert disks", task_message => "Migrating")
on_error: /System/CommonMethods/MiqAe.WeightedUpdateStatus(weight => 80, description
=> "Convert disks", task_message => "Migrating")
max_retries: '1500'
- State8:
value: "/Transformation/Infrastructure/VM/Common/CheckVmInInventory"
on_entry: /System/CommonMethods/MiqAe.WeightedUpdateStatus(weight => 15, description
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
require_domain_file
require File.join(ManageIQ::Content::Engine.root, 'content/automate/ManageIQ/Transformation/Common.class/__methods__/utils.rb')

describe ManageIQ::Automate::Transformation::Common::VMCheckTransformed do
let(:user) { FactoryBot.create(:user_with_email_and_group) }
let(:group) { FactoryBot.create(:miq_group) }
let(:task) { FactoryBot.create(:service_template_transformation_plan_task) }

let(:svc_model_user) { MiqAeMethodService::MiqAeServiceUser.find(user.id) }
let(:svc_model_group) { MiqAeMethodService::MiqAeServiceMiqGroup.find(group.id) }
let(:svc_model_task) { MiqAeMethodService::MiqAeServiceServiceTemplateTransformationPlanTask.find(task.id) }

let(:root) do
Spec::Support::MiqAeMockObject.new(
'current' => current_object,
'user' => svc_model_user,
'state_machine_phase' => 'transformation'
)
end

let(:current_object) { Spec::Support::MiqAeMockObject.new }
let(:ae_service) do
Spec::Support::MiqAeMockService.new(root).tap do |service|
current_object = Spec::Support::MiqAeMockObject.new
current_object.parent = root
service.object = current_object
end
end

before do
allow(ManageIQ::Automate::Transformation::Common::Utils).to receive(:task).and_return(svc_model_task)
allow(svc_model_task).to receive(:get_conversion_state)
end

describe "#main" do
context "virtv2v has not started conversion" do
let(:virtv2v_disks) do
[
{ :path => '[datastore] test_vm/test_vm.vmdk', :size => 1_234_567, :percent => 0, :weight => 25 },
{ :path => '[datastore] test_vm/test_vm-2.vmdk', :size => 3_703_701, :percent => 0, :weight => 75 }
]
end

it "returns a message stating conversion has not started" do
svc_model_task[:options][:virtv2v_disks] = virtv2v_disks
allow(svc_model_task).to receive(:get_option).with(:virtv2v_status).and_return('active')
described_class.new(ae_service).main
expect(ae_service.get_state_var(:ae_state_progress)).to eq('message' => 'Disks transformation is initializing.', 'percent' => 1.0)
expect(ae_service.root['ae_result']).to eq('retry')
end
end

context "conversion is still running" do
let(:virtv2v_disks) do
[
{ :path => '[datastore] test_vm/test_vm.vmdk', :size => 1_234_567, :percent => 100, :weight => 25 },
{ :path => '[datastore] test_vm/test_vm-2.vmdk', :size => 3_703_701, :percent => 25, :weight => 75 }
]
end

it "returns a message stating conversion has not started" do
svc_model_task[:options][:virtv2v_disks] = virtv2v_disks
allow(svc_model_task).to receive(:get_option).with(:virtv2v_status).and_return('active')
described_class.new(ae_service).main
expect(ae_service.get_state_var(:ae_state_progress)).to eq('message' => 'Converting disk 2 / 2 [43.75%].', 'percent' => 43.75)
expect(ae_service.root['ae_result']).to eq('retry')
end
end

context "conversion has failed" do
it "raises with a message stating conversion has failed" do
errormsg = 'virtv2v failed somehow'
ae_service.root['ae_state_retries'] = 2
allow(svc_model_task).to receive(:get_option).with(:virtv2v_status).and_return('failed')
allow(svc_model_task).to receive(:get_option).with(:virtv2v_message).and_return(errormsg)
expect { described_class.new(ae_service).main }.to raise_error(errormsg)
expect(ae_service.get_state_var(:ae_state_progress)).to eq('message' => errormsg)
end
end

context "conversion has successfuly finished" do
it "returns a message stating conversion succeeded" do
allow(svc_model_task).to receive(:get_option).with(:virtv2v_status).and_return('succeeded')
described_class.new(ae_service).main
expect(ae_service.get_state_var(:ae_state_progress)).to eq('message' => 'Disks transformation succeeded.', 'percent' => 100)
end
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
require_domain_file
require File.join(ManageIQ::Content::Engine.root, 'content/automate/ManageIQ/Transformation/Common.class/__methods__/utils.rb')

describe ManageIQ::Automate::Transformation::Common::VMTransform do
let(:user) { FactoryBot.create(:user_with_email_and_group) }
let(:group) { FactoryBot.create(:miq_group) }
let(:task) { FactoryBot.create(:service_template_transformation_plan_task) }

let(:svc_model_user) { MiqAeMethodService::MiqAeServiceUser.find(user.id) }
let(:svc_model_group) { MiqAeMethodService::MiqAeServiceMiqGroup.find(group.id) }
let(:svc_model_task) { MiqAeMethodService::MiqAeServiceServiceTemplateTransformationPlanTask.find(task.id) }

let(:root) do
Spec::Support::MiqAeMockObject.new(
'current' => current_object,
'user' => svc_model_user,
'state_machine_phase' => 'transformation'
)
end

let(:current_object) { Spec::Support::MiqAeMockObject.new }
let(:ae_service) do
Spec::Support::MiqAeMockService.new(root).tap do |service|
current_object = Spec::Support::MiqAeMockObject.new
current_object.parent = root
service.object = current_object
end
end

before do
allow(ManageIQ::Automate::Transformation::Common::Utils).to receive(:task).and_return(svc_model_task)
end

it "returns 'active' if run_conversion succeeds " do
allow(svc_model_task).to receive(:run_conversion).and_return('active')
expect(described_class.new(ae_service).main).to eq('active')
end

it "raises if run_conversion fails" do
errormsg = 'Unexpected error'
allow(svc_model_task).to receive(:run_conversion).and_raise(errormsg)
expect { described_class.new(ae_service).main }.to raise_error(errormsg)
expect(ae_service.get_state_var(:ae_state_progress)).to eq('message' => errormsg)
end
end

0 comments on commit 1c76cd2

Please sign in to comment.