From: Jan Provaznik<jprovazn(a)redhat.com>
https://www.aeolusproject.org/redmine/issues/2453
---
src/app/models/hardware_profile.rb | 34 ++++++-----------------
src/app/models/hardware_profile_property.rb | 2 +-
src/spec/factories/hardware_profile.rb | 9 ++++++
src/spec/factories/hardware_profile_property.rb | 7 +++++
src/spec/models/hardware_profile_spec.rb | 9 +++++-
5 files changed, 34 insertions(+), 27 deletions(-)
diff --git a/src/app/models/hardware_profile.rb b/src/app/models/hardware_profile.rb
index 2a5268e..cfe7022 100644
--- a/src/app/models/hardware_profile.rb
+++ b/src/app/models/hardware_profile.rb
@@ -137,29 +137,13 @@ class HardwareProfile< ActiveRecord::Base
def self.match_provider_hardware_profile(provider, hardware_profile)
hardware_profiles = match_hardware_profiles(provider, hardware_profile)
- matched_hwp = hardware_profiles.first
- value = '99999999'
- hardware_profiles.each do |hwp|
- case hwp.memory.kind
- when "fixed"
- if BigDecimal.new(hwp.memory.value.to_s)< BigDecimal.new(value.to_s)
- value = hwp.memory.value
- matched_hwp = hwp
- end
- when "range"
- if BigDecimal.new(hwp.memory.range_last.to_s)< BigDecimal.new(value.to_s)
- value = hwp.memory.range_last
- matched_hwp = hwp
- end
- when "enum"
- values = create_array_from_property(hwp.memory.to_s).sort
- if BigDecimal.new(value.last)< BigDecimal.new(value.to_s)
- value = values.last
- matched_hwp = hwp
- end
- end
- end
- return matched_hwp
+ # there can be multiple matching hw profiles,
+ # for now pick hw profile with lowest memory.
+ # (supposing that memory is most expensive component
+ # of hw profile)
+ hardware_profiles.sort do |hw1, hw2|
+ BigDecimal.new(hw1.memory.sort_value(false).to_s)<=>
BigDecimal.new(hw2.memory.sort_value(false).to_s)
+ end.first
end
def self.generate_override_property_values(front_end_hwp, back_end_hwp)
@@ -180,7 +164,7 @@ class HardwareProfile< ActiveRecord::Base
return front_end_property.value.present? ? front_end_property.value :
back_end_property.value
when "enum"
create_array_from_property(back_end_property).sort!.each do |value|
- if BigDecimal.new(value)>= BigDecimal.new(front_end_property.value)
+ if front_end_property.value.nil? or BigDecimal.new(value)>=
BigDecimal.new(front_end_property.value)
return value
end
end
@@ -223,7 +207,7 @@ class HardwareProfile< ActiveRecord::Base
match = BigDecimal.new(back_end_property.range_last.to_s)>=
BigDecimal.new(front_end_property.value.to_s) ? true : false
when "enum"
create_array_from_property(back_end_property).each do |value|
- if BigDecimal.new(value)>= BigDecimal.new(front_end_property.value.to_s)
+ if front_end_property.value.nil? or BigDecimal.new(value)>=
BigDecimal.new(front_end_property.value)
match = true
end
end
diff --git a/src/app/models/hardware_profile_property.rb
b/src/app/models/hardware_profile_property.rb
index 41ba959..6cf38ca 100644
--- a/src/app/models/hardware_profile_property.rb
+++ b/src/app/models/hardware_profile_property.rb
@@ -136,7 +136,7 @@ class HardwareProfileProperty< ActiveRecord::Base
when "fixed"
sort_value = value
when "range"
- sort_value = ascending ? range_from : range_to
+ sort_value = ascending ? range_first : range_last
when "enum"
entries = (property_enum_entries.map { |enum| enum.value }).sort!
sort_value = ascending ? entries.first : entries.last
diff --git a/src/spec/factories/hardware_profile.rb
b/src/spec/factories/hardware_profile.rb
index d505838..c8ac8c6 100644
--- a/src/spec/factories/hardware_profile.rb
+++ b/src/spec/factories/hardware_profile.rb
@@ -93,4 +93,13 @@ FactoryGirl.define do
external_key 'front_nil_cpu'
end
+ factory :front_end_nil_storage, :parent => :hardware_profile do
+ memory { |p| p.association(:front_hwp3_memory) }
+ storage { |p| p.association(:hwpp_nil_storage) }
+ cpu { |p| p.association(:front_hwp1_cpu) }
+ architecture { |p| p.association(:front_hwp3_arch) }
+ name 'front_nil_storage'
+ external_key 'front_nil_storage'
+ end
+
end
diff --git a/src/spec/factories/hardware_profile_property.rb
b/src/spec/factories/hardware_profile_property.rb
index 9ddde28..7b78868 100644
--- a/src/spec/factories/hardware_profile_property.rb
+++ b/src/spec/factories/hardware_profile_property.rb
@@ -243,4 +243,11 @@ FactoryGirl.define do
value nil
end
+ factory :hwpp_nil_storage, :parent => :hardware_profile_property do
+ name 'storage'
+ kind 'enum'
+ unit 'GB'
+ value nil
+ end
+
end
diff --git a/src/spec/models/hardware_profile_spec.rb
b/src/spec/models/hardware_profile_spec.rb
index fcf9296..6fef1fe 100644
--- a/src/spec/models/hardware_profile_spec.rb
+++ b/src/spec/models/hardware_profile_spec.rb
@@ -95,7 +95,7 @@ describe HardwareProfile do
front_end_cpu = FactoryGirl.create(:hwpp_fixed, :name => 'cpu', :unit
=> 'count', :value => '2')
front_end_architecture = FactoryGirl.create(:hwpp_fixed, :name =>
'architecture', :unit => 'label', :value => 'x86_64')
- back_end_memory1 = FactoryGirl.create(:hwpp_range, :name => 'memory',
:unit => 'MB', :value => '4048', :range_first =>
'1024', :range_last => '4048')
+ back_end_memory1 = create_hwpp_enum(['1024', '2048',
'4048'], {:name => 'memory', :unit => 'MB', :value =>
'4048'})
back_end_storage1 = create_hwpp_enum(['500', '1500',
'2000'], {:name => 'storage', :unit => 'GB', :value =>
'1500'})
back_end_cpu1 = FactoryGirl.create(:hwpp_range, :name => 'cpu', :unit
=> 'count', :value => '4', :range_first => '1',
:range_last => '4')
back_end_architecture1 = FactoryGirl.create(:hwpp_fixed, :name =>
'architecture', :unit => 'label', :value => 'x86_64')
@@ -215,6 +215,13 @@ describe HardwareProfile do
overrides[:cpu].should_not be_blank
end
+ it "should handle nils in enum values in generate_override_property_values"
do
+ p = create_hwpp_enum(['500', '1500', '2000'], {:name =>
'storage', :unit => 'GB', :value => '1500'})
+ fe_hwp = Factory.create(:front_end_nil_storage)
+ be_hwp = Factory.create(:mock_hwp2, :storage => p)
+ overrides = HardwareProfile.generate_override_property_values(fe_hwp, be_hwp)
+ overrides[:storage].should_not be_blank
+ end
def create_hwpp_enum(value_array, properties = {})
hwpp_enum = FactoryGirl.create(:hwpp_enum, properties)
ACK
--
No trees were killed to send this message, but a large number of
electrons were terribly inconvenienced.