diff --git a/app/models/wds_server.rb b/app/models/wds_server.rb index a0c4a4db629da174367570d4ed3c1a27dd063fc6..b1f6294ccdebcefb04630a4c5885b36f6967e914 100644 --- a/app/models/wds_server.rb +++ b/app/models/wds_server.rb @@ -208,11 +208,25 @@ class WdsServer < ApplicationRecord def images(type, name = nil) raise ArgumentError, 'Type must be :boot or :install' unless %i[boot install].include? type - objects = connection.run_wql("SELECT * FROM MSFT_Wds#{type.to_s.capitalize}Image#{" WHERE Name=\"#{name}\"" if name}")["msft_wds#{type}image".to_sym] rescue nil - objects = nil if objects.empty? - objects ||= underscore_result([JSON.parse(connection.shell(:powershell) do |s| - s.run("Get-WDS#{type.to_s.capitalize}Image #{"-ImageName '#{name.sub("'", "`'")}'" if name} | ConvertTo-Json -Compress") - end.stdout)].flatten) + begin + objects = connection.run_wql("SELECT * FROM MSFT_Wds#{type.to_s.capitalize}Image#{" WHERE Name=\"#{name}\"" if name}")["msft_wds#{type}image".to_sym] + objects = nil if objects.empty? + rescue StandardError => e + ::Rails.logger.debug "WQL image query failed with #{e.class}: #{e}" + end + + unless objects + begin + result = connection.shell(:powershell) do |s| + s.run("Get-WDS#{type.to_s.capitalize}Image #{"-ImageName '#{name.sub("'", "`'")}'" if name} | ConvertTo-Json -Compress") + end + + objects = underscore_result([JSON.parse(result.stdout)].flatten) + rescue JSON::ParserError => e + ::Rails.logger.error "#{e.class}: #{e}\n#{result}" + raise e + end + end objects.map do |obj| ForemanWds.const_get("Wds#{type.to_s.capitalize}Image").new obj.merge(wds_server: self)