Skip to content

Commit

Permalink
Merge pull request #14363 from lpichler/suppots_dots_in_custom_attrib…
Browse files Browse the repository at this point in the history
…utes

[EUWE] Suppots dots in custom attributes
  • Loading branch information
simaishi authored Mar 20, 2017
2 parents 2dd833b + c5bf37f commit b07bd16
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 10 deletions.
6 changes: 5 additions & 1 deletion app/models/miq_report.rb
Original file line number Diff line number Diff line change
Expand Up @@ -124,9 +124,13 @@ def self.display_filter_details(cols, mode)
return [] if cols.nil?
cols.inject([]) do |r, c|
# eg. c = ["Host.Hardware.Disks : File Name", "Host.hardware.disks-filename"]
parts = c.last.split(".")
field = c.last
field, virtual_custom_attribute = MiqExpression.escape_virtual_custom_attribute(field)
parts = field.split(".")
parts[-1] = parts.last.split("-").first # Strip off field name from last element

parts.map!{ |x| URI::RFC2396_Parser.new.unescape(x) } if virtual_custom_attribute

if parts.last == "managed"
next(r) unless mode == :tag
parts.pop # Remove "managed" from tail andjust just evaluate relationship
Expand Down
5 changes: 4 additions & 1 deletion lib/extensions/ar_taggable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,10 @@ def tag_list(options = {})
def vtag_list(options = {})
ns = Tag.get_namespace(options)

predicate = ns.split("/")[2..-1] # throw away /virtual
ns.gsub!('/virtual/','') # throw away /virtual
ns, virtual_custom_attribute = MiqExpression.escape_virtual_custom_attribute(ns)
predicate = ns.split('/')
predicate.map!{ |x| URI::RFC2396_Parser.new.unescape(x) } if virtual_custom_attribute

# p "ns: [#{ns}]"
# p "predicate: [#{predicate.inspect}]"
Expand Down
11 changes: 11 additions & 0 deletions lib/miq_expression.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1047,8 +1047,19 @@ def self.preprocess_managed_tag(tag)
tag
end

def self.escape_virtual_custom_attribute(attribute)
if attribute.include?(CustomAttributeMixin::CUSTOM_ATTRIBUTES_PREFIX)
uri_parser = URI::RFC2396_Parser.new
[uri_parser.escape(attribute, /[^A-Za-z0-9:\-_]/), true]
else
[attribute, false]
end
end

def self.value2tag(tag, val = nil)
tag, virtual_custom_attribute = escape_virtual_custom_attribute(tag)
model, *values = tag.to_s.gsub(/[\.-]/, "/").split("/") # replace model path ".", column name "-" with "/"
values.map!{ |x| URI::RFC2396_Parser.new.unescape(x) } if virtual_custom_attribute

case values.first
when "user_tag"
Expand Down
9 changes: 7 additions & 2 deletions lib/miq_expression/field.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,19 @@ class MiqExpression::Field
FIELD_REGEX = /
(?<model_name>([[:upper:]][[:alnum:]]*(::)?)+)
\.?(?<associations>[a-z_\.]+)*
-(?<column>[a-z]+(_[[:alnum:]]+)*)
-
(?:
(?<virtual_custom_column>#{CustomAttributeMixin::CUSTOM_ATTRIBUTES_PREFIX}[a-z]+[_\-.\/[:alnum:]]*)|
(?<column>[a-z]+(_[[:alnum:]]+)*)
)
/x

ParseError = Class.new(StandardError)

def self.parse(field)
match = FIELD_REGEX.match(field) or raise ParseError, field
new(match[:model_name].constantize, match[:associations].to_s.split("."), match[:column])
new(match[:model_name].constantize, match[:associations].to_s.split("."), match[:virtual_custom_column] ||
match[:column])
end

attr_reader :model, :associations, :column
Expand Down
13 changes: 7 additions & 6 deletions spec/models/miq_report_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -81,16 +81,16 @@

context "report with virtual dynamic custom attributes" do
let(:options) { {:targets_hash => true, :userid => "admin"} }
let(:custom_column_key_1) { 'ATTR_Name_1' }
let(:custom_column_key_2) { 'ATTR_Name_2' }
let(:custom_column_key_1) { 'kubernetes.io/hostname' }
let(:custom_column_key_2) { 'manageiq.org' }
let(:custom_column_key_3) { 'ATTR_Name_3' }
let(:custom_column_value) { 'value1' }
let(:user) { FactoryGirl.create(:user_with_group) }
let(:ems) { FactoryGirl.create(:ems_vmware) }
let!(:vm_1) { FactoryGirl.create(:vm_vmware) }
let!(:vm_2) { FactoryGirl.create(:vm_vmware, :retired => false, :ext_management_system => ems) }
let(:virtual_column_key_1) { "#{CustomAttributeMixin::CUSTOM_ATTRIBUTES_PREFIX}ATTR_Name_1" }
let(:virtual_column_key_2) { "#{CustomAttributeMixin::CUSTOM_ATTRIBUTES_PREFIX}ATTR_Name_2" }
let(:virtual_column_key_1) { "#{CustomAttributeMixin::CUSTOM_ATTRIBUTES_PREFIX}kubernetes.io/hostname" }
let(:virtual_column_key_2) { "#{CustomAttributeMixin::CUSTOM_ATTRIBUTES_PREFIX}manageiq.org" }
let(:virtual_column_key_3) { "#{CustomAttributeMixin::CUSTOM_ATTRIBUTES_PREFIX}ATTR_Name_3" }
let(:miq_task) { FactoryGirl.create(:miq_task) }

Expand All @@ -111,9 +111,9 @@
MiqReport.new(
:name => "Custom VM report", :title => "Custom VM report", :rpt_group => "Custom", :rpt_type => "Custom",
:db => "ManageIQ::Providers::InfraManager::Vm",
:cols => %w(name virtual_custom_attribute_ATTR_Name_1 virtual_custom_attribute_ATTR_Name_2),
:cols => %w(name virtual_custom_attribute_kubernetes.io/hostname virtual_custom_attribute_manageiq.org),
:include => {:custom_attributes => {}},
:col_order => %w(name virtual_custom_attribute_ATTR_Name_1 virtual_custom_attribute_ATTR_Name_2),
:col_order => %w(name virtual_custom_attribute_kubernetes.io/hostname virtual_custom_attribute_manageiq.org),
:headers => ["Name", custom_column_key_1, custom_column_key_1],
:order => "Ascending"
)
Expand Down Expand Up @@ -151,6 +151,7 @@
end

expected_results = ["name" => vm_1.name, virtual_column_key_1 => custom_column_value, virtual_column_key_2 => nil]

expect(report_result).to match_array(expected_results)
end

Expand Down

0 comments on commit b07bd16

Please sign in to comment.