Skip to content

Commit

Permalink
Add service_vars to pass variables between catalog items in a bundle
Browse files Browse the repository at this point in the history
  • Loading branch information
lfu committed Jul 22, 2019
1 parent f939b59 commit a8eb5a3
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 0 deletions.
Expand Up @@ -92,6 +92,33 @@ def ansible_stats_vars
MiqAeEngine::MiqAeAnsibleMethodBase.ansible_stats_from_hash(@persist_state_hash)
end

def set_service_var(name, value)
if service_object.nil?
$miq_ae_logger.error("Service object not found in root object, set_service_var skipped for #{name} = #{value}")
return
end

service_object.root_service.set_service_vars_option(name, value)
end

def service_var_exists?(name)
return false unless service_object

service_object.root_service.service_vars_options.key?(name)
end

def get_service_var(name)
return unless service_var_exists?(name)

service_object.root_service.get_service_vars_option(name)
end

def delete_service_var(name)
return unless service_var_exists?(name)

service_object.root_service.delete_service_vars_option(name)
end

def prepend_namespace=(ns)
@workspace.prepend_namespace = ns
end
Expand Down Expand Up @@ -332,6 +359,10 @@ def __find_instance_from_path(path)

private

def service_object
current['service'] || root['service']
end

def editable_instance?(path)
dom, = MiqAeEngine::MiqAePath.get_domain_ns_klass_inst(path)
return false unless owned_domain?(dom)
Expand Down
25 changes: 25 additions & 0 deletions lib/miq_automation_engine/service_models/miq_ae_service_service.rb
Expand Up @@ -48,6 +48,31 @@ def set_dialog_option(key, value)
end
end

def service_vars_options
@object.options[:service_vars] ||= HashWithIndifferentAccess.new
end

def get_service_vars_option(key)
service_vars_options[key]
end

def set_service_vars_option(key, value)
ar_method do
service_vars_options[key] = value
@object.update(:options => @object.options)
end
end

def delete_service_vars_option(key)
return unless service_vars_options&.key?(key)

ar_method do
service_vars_options.delete(key).tap do
@object.update(:options => @object.options)
end
end
end

def name=(new_name)
ar_method do
@object.update!(:name => new_name)
Expand Down
57 changes: 57 additions & 0 deletions spec/miq_ae_service_spec.rb
Expand Up @@ -134,6 +134,63 @@
expect(miq_ae_service.ansible_stats_vars).to eq('var1' => 'value1', 'var2' => 'value2')
end
end

context 'service_var method' do
let(:user) { FactoryBot.create(:user_with_group) }

def invoke_ae
MiqAeEngine.instantiate("/EVM/AUTOMATE/test1?Service::service=#{@service.id}", user)
end

before do
Spec::Support::MiqAutomateHelper.create_service_model_method('SPEC_DOMAIN', 'EVM', 'AUTOMATE', 'test1', 'test')
@ae_method = ::MiqAeMethod.first

@parent = FactoryBot.create(:service)
@service = FactoryBot.create(:service, :service => @parent)
end

it 'set_service_var' do
method = "$evm.set_service_var('var1', 'value1')"
@ae_method.update(:data => method)
invoke_ae

@parent.reload
@service.reload

expect(@parent.options.dig(:service_vars, 'var1')).to eq('value1')
expect(@service.options.dig(:service_vars)).not_to be_present
end

it 'service_var_exists?' do
@parent.update(:options => {:service_vars => {'var1' => 'value1'}})
method = "$evm.root['var1_exists'] = $evm.service_var_exists?('var1'); $evm.root['var2_exists'] = $evm.service_var_exists?('var2')"
@ae_method.update(:data => method)
result = invoke_ae

expect(result.root['var1_exists']).to be true
expect(result.root['var2_exists']).to be false
end

it 'get_service_var' do
@parent.update(:options => {:service_vars => {'var1' => 'value1'}})
method = "$evm.root['var1'] = $evm.get_service_var('var1'); $evm.root['var2'] = $evm.get_service_var('var2')"
@ae_method.update(:data => method)
result = invoke_ae

expect(result.root['var1']).to eq('value1')
expect(result.root['var2']).to be nil
end

it 'delete_service_var' do
@parent.update(:options => {:service_vars => {'var1' => 'value1'}})
method = "$evm.delete_service_var('var1'); $evm.root['var1'] = $evm.get_service_var('var1')"
@ae_method.update(:data => method)
result = invoke_ae

expect(result.root['var1']).to be nil
end
end
end

describe MiqAeMethodService::MiqAeService do
Expand Down

0 comments on commit a8eb5a3

Please sign in to comment.