Skip to content

Commit 5d6b6ef

Browse files
Fix automation array values
1 parent 739ad44 commit 5d6b6ef

File tree

3 files changed

+72
-38
lines changed

3 files changed

+72
-38
lines changed

lib/miq_automation_engine/engine/miq_ae_engine.rb

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ def self.create_automation_attribute_name(object)
212212

213213
def self.create_automation_attribute_key(object, attr_name = nil)
214214
klass_name = create_automation_attribute_class_name(object)
215-
return klass_name.to_s if automation_attribute_is_array?(klass_name)
215+
return klass_name.to_s if automation_attribute_is_array?(klass_name, object)
216216

217217
attr_name ||= create_automation_attribute_name(object)
218218
"#{klass_name}::#{attr_name}"
@@ -222,14 +222,26 @@ def self.create_automation_attribute_value(object)
222222
object.id
223223
end
224224

225-
def self.automation_attribute_is_array?(attr)
226-
attr.to_s.downcase.starts_with?("array::")
225+
def self.automation_attribute_is_array?(attr, object = nil)
226+
if !object.nil? && !object.kind_of?(String) && object.has_attribute?(:options) && !object.options.nil? && !object.options[:dialog].nil?
227+
object[:options][:dialog][attr].kind_of?(Array)
228+
else
229+
attr.to_s.downcase.starts_with?("array::")
230+
end
227231
end
228232

229233
def self.create_automation_attributes_string(hash)
230234
args = create_automation_attributes(hash)
231235
return args if args.kind_of?(String)
232236

237+
# result_array = []
238+
# args.keys.each do |k|
239+
# args[k].each do |item|
240+
# result_array.push(item.id)
241+
# end
242+
# end
243+
# result_string = result_array.join("\x1F")
244+
233245
args.collect { |a| a.join("=") }.join("&")
234246
end
235247

@@ -254,13 +266,14 @@ def self.create_automation_attribute(key, value)
254266
end
255267

256268
def self.create_automation_attribute_array_key(key)
257-
"Array::#{key}"
269+
key
258270
end
259271

260272
def self.create_automation_attribute_array_value(value)
273+
# value
261274
value.collect do |obj|
262-
obj.kind_of?(ActiveRecord::Base) ? "#{obj.class.name}::#{obj.id}" : obj.to_s
263-
end.join("\x1F")
275+
obj.kind_of?(ActiveRecord::Base) ? obj.id.to_s : obj.to_s
276+
end
264277
end
265278

266279
def self.set_automation_attributes_from_objects(objects, attrs_hash)
@@ -311,9 +324,20 @@ def self.create_ae_attrs(attrs, name, vmdb_object, objects = [MiqServer.my_serve
311324
ae_attrs["MiqRequest::miq_request"] = vmdb_object.id if vmdb_object.kind_of?(MiqRequest)
312325
ae_attrs['vmdb_object_type'] = create_automation_attribute_name(vmdb_object) unless vmdb_object.nil?
313326

314-
array_objects = ae_attrs.keys.find_all { |key| automation_attribute_is_array?(key) }
315-
array_objects.each do |o|
316-
ae_attrs[o] = ae_attrs[o].first if ae_attrs[o].kind_of?(Array)
327+
# Sends array attributes to the miq_ae_object as strings with \x1F between each array item.
328+
array_objects = ae_attrs.keys.find_all { |key| ae_attrs[key].kind_of?(Array) }
329+
array_objects.each do |array_object|
330+
# Each array attribute is tagged with Array:: before the attribute key unless it already starts with Array::
331+
array_attr_key = array_object
332+
if !array_object.starts_with?("Array::")
333+
array_attr_key = "Array::#{array_object}"
334+
end
335+
ae_attrs[array_attr_key] = ae_attrs[array_object].collect do |obj|
336+
obj.kind_of?(ActiveRecord::Base) ? "#{obj.class.name}::#{obj.id}" : obj.to_s
337+
end.join("\x1F")
338+
if !array_object.starts_with?("Array::")
339+
ae_attrs.delete(array_object)
340+
end
317341
end
318342
ae_attrs
319343
end

lib/miq_automation_engine/engine/miq_ae_engine/miq_ae_object.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ def user_info_attributes(user)
253253
end
254254

255255
def process_args_as_attributes(args = {})
256-
args.keys.each { |k| MiqAeEngine.automation_attribute_is_array?(k) ? process_args_array(args, k) : process_args_attribute(args, k) }
256+
args.keys.each { |k| attribute_is_array?(args, k) ? process_args_array(args, k) : process_args_attribute(args, k) }
257257
@attributes.merge!(args)
258258
end
259259

@@ -264,6 +264,10 @@ def process_args_array(args, args_key)
264264
args[key.downcase] = load_array_objects_from_string(value)
265265
end
266266

267+
def attribute_is_array?(object, attr)
268+
attr.to_s.downcase.starts_with?("array::")
269+
end
270+
267271
def process_args_attribute(args, args_key)
268272
# process MiqServer::svr => 2
269273
if args_key.include?(CLASS_SEPARATOR)

spec/miq_ae_engine_spec.rb

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -289,10 +289,11 @@ def call_automate(obj_type, obj_id, open_url_task_id = nil)
289289
end
290290

291291
it "will process an array of objects" do
292+
FactoryBot.create(:host)
292293
FactoryBot.create(:host)
293294
hash = {"hosts" => Host.all}
294295
attrs = {"Array::my_hosts" => hash["hosts"].collect { |h| "Host::#{h.id}" }}
295-
result_str = "Array%3A%3Amy_hosts=" + hash["hosts"].collect { |h| "Host%3A%3A#{h.id}" }.join(",")
296+
result_str = "Array%3A%3Amy_hosts=" + hash["hosts"].collect { |h| "Host%3A%3A#{h.id}" }.join("%1F") # After URL encoding the separator "\x1F" is converted to %1F
296297
extras = "MiqServer%3A%3Amiq_server=#{miq_server_id}"
297298
uri = "/System/Process/AUTOMATION?#{result_str}&#{extras}&object_name=AUTOMATION"
298299
expect(MiqAeEngine.create_automation_object("AUTOMATION", attrs)).to eq(uri)
@@ -374,26 +375,28 @@ def call_automate(obj_type, obj_id, open_url_task_id = nil)
374375
end
375376

376377
it "with an array of Vms" do
377-
hash = {"vms" => Vm.all}
378-
result_str = "Array::vms=#{hash["vms"].collect { |v| "ManageIQ::Providers::Vmware::InfraManager::Vm::#{v.id}" }.join("\x1F")}"
379-
result_arr = hash["vms"].collect { |v| "ManageIQ::Providers::Vmware::InfraManager::Vm::#{v.id}" }.join("\x1F")
380-
result = MiqAeEngine.create_automation_attributes(hash)
378+
result_arr = []
379+
hash = {"vms" => Vm.all}
380+
result_str = "vms=#{hash["vms"].collect { |v| v.id.to_s }.join("=")}"
381+
hash["vms"].collect { |v| result_arr.push(v.id.to_s) }
382+
result = MiqAeEngine.create_automation_attributes(hash)
381383
expect(MiqAeEngine.create_automation_attributes_string(hash)).to eq(result_str)
382-
expect(result["Array::vms"]).to eq(result_arr)
384+
expect(result["vms"]).to eq(result_arr)
383385
end
384386

385387
it "with an array containing a single Vm" do
386-
hash = {"vms" => [Vm.first]}
387-
result_str = "Array::vms=#{hash["vms"].collect { |v| "ManageIQ::Providers::Vmware::InfraManager::Vm::#{v.id}" }.join("\x1F")}"
388-
result_arr = hash["vms"].collect { |v| "ManageIQ::Providers::Vmware::InfraManager::Vm::#{v.id}" }.join("\x1F")
389-
result = MiqAeEngine.create_automation_attributes(hash)
388+
result_arr = []
389+
hash = {"vms" => [Vm.first]}
390+
result_str = "vms=#{hash["vms"].collect { |v| v.id.to_s }.join("=")}"
391+
hash["vms"].collect { |v| result_arr.push(v.id.to_s) }
392+
result = MiqAeEngine.create_automation_attributes(hash)
390393
expect(MiqAeEngine.create_automation_attributes_string(hash)).to eq(result_str)
391-
expect(result["Array::vms"]).to eq(result_arr)
394+
expect(result["vms"]).to eq(result_arr)
392395
end
393396

394397
it "with an empty array" do
395398
result = MiqAeEngine.create_automation_attributes("vms" => [])
396-
expect(result["Array::vms"]).to eq("")
399+
expect(result["vms"]).to eq([])
397400
end
398401

399402
it "with a hash containing a single Vm" do
@@ -405,24 +408,27 @@ def call_automate(obj_type, obj_id, open_url_task_id = nil)
405408
end
406409

407410
it "with an array of Hosts" do
411+
result_arr = []
408412
hash = {"hosts" => Host.all}
409-
result_str = "Array::hosts=#{hash["hosts"].collect { |h| "Host::#{h.id}" }.join("\x1F")}"
410-
result_arr = hash["hosts"].collect { |h| "Host::#{h.id}" }.join("\x1F")
411-
result = MiqAeEngine.create_automation_attributes(hash)
413+
result_str = "hosts=#{hash["hosts"].collect { |h| h.id.to_s }.join("=")}"
414+
hash["hosts"].collect { |h| result_arr.push(h.id.to_s) }
415+
result = MiqAeEngine.create_automation_attributes(hash)
412416
expect(MiqAeEngine.create_automation_attributes_string(hash)).to eq(result_str)
413-
expect(result["Array::hosts"]).to eq(result_arr)
417+
expect(result["hosts"]).to eq(result_arr)
414418
end
415419

416420
it "with multiple arrays" do
421+
vm_result_arr = []
422+
host_result_arr = []
417423
hash = {"vms" => Vm.all}
418-
vm_result_str = "Array::vms=#{hash["vms"].collect { |v| "ManageIQ::Providers::Vmware::InfraManager::Vm::#{v.id}" }.join("\x1F")}"
419-
vm_result_arr = hash["vms"].collect { |v| "ManageIQ::Providers::Vmware::InfraManager::Vm::#{v.id}" }.join("\x1F")
424+
vm_result_str = "vms=#{hash["vms"].collect { |v| v.id.to_s }.join("=")}"
425+
hash["vms"].collect { |v| vm_result_arr.push(v.id.to_s) }
420426
hash["hosts"] = Host.all
421-
host_result_str = "Array::hosts=#{hash["hosts"].collect { |h| "Host::#{h.id}" }.join("\x1F")}"
422-
host_result_arr = hash["hosts"].collect { |h| "Host::#{h.id}" }.join("\x1F")
423-
result = MiqAeEngine.create_automation_attributes(hash)
424-
expect(result["Array::vms"]).to eq(vm_result_arr)
425-
expect(result["Array::hosts"]).to eq(host_result_arr)
427+
host_result_str = "hosts=#{hash["hosts"].collect { |h| h.id.to_s }.join("=")}"
428+
hash["hosts"].collect { |h| host_result_arr.push(h.id.to_s) }
429+
result = MiqAeEngine.create_automation_attributes(hash)
430+
expect(result["vms"]).to eq(vm_result_arr)
431+
expect(result["hosts"]).to eq(host_result_arr)
426432
result_str = MiqAeEngine.create_automation_attributes_string(hash)
427433
expect(result_str).to include(vm_result_str)
428434
expect(result_str).to include(host_result_str)
@@ -431,16 +437,16 @@ def call_automate(obj_type, obj_id, open_url_task_id = nil)
431437
it "with invalid object references" do
432438
hash = {"vms" => ["bogus::12"]}
433439
result = MiqAeEngine.create_automation_attributes(hash)
434-
expect(result["Array::vms"]).to eq("bogus::12")
435-
expect(MiqAeEngine.create_automation_attributes_string(hash)).to eq("Array::vms=bogus::12")
440+
expect(result["vms"]).to eq(["bogus::12"])
441+
expect(MiqAeEngine.create_automation_attributes_string(hash)).to eq("vms=bogus::12")
436442
end
437443

438444
it "with garbage values" do
439445
hash = {"vms" => ["bogus::12,garbage::moreso,notevenclose"]}
440-
bogus_arr = "bogus::12,garbage::moreso,notevenclose"
446+
bogus_arr = ["bogus::12,garbage::moreso,notevenclose"]
441447
result = MiqAeEngine.create_automation_attributes(hash)
442-
expect(result["Array::vms"]).to eq(bogus_arr)
443-
expect(MiqAeEngine.create_automation_attributes_string(hash)).to eq("Array::vms=bogus::12,garbage::moreso,notevenclose")
448+
expect(result["vms"]).to eq(bogus_arr)
449+
expect(MiqAeEngine.create_automation_attributes_string(hash)).to eq("vms=bogus::12,garbage::moreso,notevenclose")
444450
end
445451

446452
it "with a string value" do

0 commit comments

Comments
 (0)