diff options
author | piyushawasthi <piyush.awasthi@msystechnologies.com> | 2017-10-04 20:34:04 +0530 |
---|---|---|
committer | piyushawasthi <piyush.awasthi@msystechnologies.com> | 2017-10-05 12:52:37 +0530 |
commit | 39d2db9789e7ff3b24d6a10e5b40a0fed4efc547 (patch) | |
tree | c52fd4d48ec69319dabe97a949e6ac2a3ae66fed /lib/chef/util | |
parent | 838056df40c799f4c0f523b777de3c21506d7945 (diff) | |
download | chef-39d2db9789e7ff3b24d6a10e5b40a0fed4efc547.tar.gz |
MSYS-684: Added parser for DSC configuration
Signed-off-by: piyushawasthi <piyush.awasthi@msystechnologies.com>
Diffstat (limited to 'lib/chef/util')
-rw-r--r-- | lib/chef/util/dsc/lcm_output_parser.rb | 59 | ||||
-rw-r--r-- | lib/chef/util/dsc/local_configuration_manager.rb | 32 |
2 files changed, 73 insertions, 18 deletions
diff --git a/lib/chef/util/dsc/lcm_output_parser.rb b/lib/chef/util/dsc/lcm_output_parser.rb index 9473ca8a86..f19f637b6d 100644 --- a/lib/chef/util/dsc/lcm_output_parser.rb +++ b/lib/chef/util/dsc/lcm_output_parser.rb @@ -28,7 +28,7 @@ class Chef # Parses the output from LCM and returns a list of Chef::Util::DSC::ResourceInfo objects # that describe how the resources affected the system # - # Example: + # Example for WhatIfParser: # parse <<-EOF # What if: [Machine]: LCM: [Start Set ] # What if: [Machine]: LCM: [Start Resource ] [[File]FileToNotBeThere] @@ -53,7 +53,62 @@ class Chef # ) # ] # - def self.parse(lcm_output) + # Example for TestDSCParser: + # parse <<-EOF + # InDesiredState : False + # ResourcesInDesiredState : + # ResourcesNotInDesiredState: {[Environment]texteditor} + # ReturnValue : 0 + # PSComputerName : . + # EOF + # + # would return + # + # [ + # Chef::Util::DSC::ResourceInfo.new( + # '{[Environment]texteditor}', + # true, + # [ + # ] + # ) + # ] + # + + def self.parse(lcm_output, test_dsc_configuration) + test_dsc_configuration ? test_dsc_parser(lcm_output) : what_if_parser(lcm_output) + end + + def self.test_dsc_parser(lcm_output) + lcm_output ||= "" + current_resource = Hash.new + + resources = [] + lcm_output.lines.each do |line| + op_action , op_value = line.strip.split(":") + op_action&.strip! + case op_action + when "InDesiredState" + current_resource[:skipped] = op_value.strip == "True" ? true : false + when "ResourcesInDesiredState" + current_resource[:name] = op_value.strip if op_value + when "ResourcesNotInDesiredState" + current_resource[:name] = op_value.strip if op_value + when "ReturnValue" + current_resource[:context] = nil + end + end + if current_resource[:name] + resources.push(current_resource) + end + + if resources.length > 0 + build_resource_info(resources) + else + raise Chef::Exceptions::LCMParser, "Could not parse:\n#{lcm_output}" + end + end + + def self.what_if_parser(lcm_output) lcm_output ||= "" current_resource = Hash.new diff --git a/lib/chef/util/dsc/local_configuration_manager.rb b/lib/chef/util/dsc/local_configuration_manager.rb index 1f154b1c71..07109f7f92 100644 --- a/lib/chef/util/dsc/local_configuration_manager.rb +++ b/lib/chef/util/dsc/local_configuration_manager.rb @@ -29,7 +29,7 @@ class Chef::Util::DSC def test_configuration(configuration_document, shellout_flags) status = run_configuration_cmdlet(configuration_document, false, shellout_flags) - log_what_if_exception(status.stderr) unless status.succeeded? + log_dsc_exception(status.stderr) unless status.succeeded? configuration_update_required?(status.return_value) end @@ -77,7 +77,7 @@ class Chef::Util::DSC ps4_base_command else if ps_version_gte_5? - "#{common_command_prefix} Test-DscConfiguration -path #{@configuration_path}" + "#{common_command_prefix} Test-DscConfiguration -path #{@configuration_path} | format-list" else ps4_base_command + " -whatif; if (! $?) { exit 1 }" end @@ -88,31 +88,31 @@ class Chef::Util::DSC Chef::Platform.supported_powershell_version?(@node, 5) end - def log_what_if_exception(what_if_exception_output) - if whatif_not_supported?(what_if_exception_output) + def log_dsc_exception(dsc_exception_output) + if whatif_not_supported?(dsc_exception_output) # LCM returns an error if any of the resources do not support the opptional What-If Chef::Log.warn("Received error while testing configuration due to resource not supporting 'WhatIf'") - elsif dsc_module_import_failure?(what_if_exception_output) - Chef::Log.warn("Received error while testing configuration due to a module for an imported resource possibly not being fully installed:\n#{what_if_exception_output.gsub(/\s+/, ' ')}") + elsif dsc_module_import_failure?(dsc_exception_output) + Chef::Log.warn("Received error while testing configuration due to a module for an imported resource possibly not being fully installed:\n#{dsc_exception_output.gsub(/\s+/, ' ')}") else - Chef::Log.warn("Received error while testing configuration:\n#{what_if_exception_output.gsub(/\s+/, ' ')}") + Chef::Log.warn("Received error while testing configuration:\n#{dsc_exception_output.gsub(/\s+/, ' ')}") end end - def whatif_not_supported?(what_if_exception_output) - !! (what_if_exception_output.gsub(/[\r\n]+/, "").gsub(/\s+/, " ") =~ /A parameter cannot be found that matches parameter name 'Whatif'/i) + def whatif_not_supported?(dsc_exception_output) + !! (dsc_exception_output.gsub(/[\r\n]+/, "").gsub(/\s+/, " ") =~ /A parameter cannot be found that matches parameter name 'Whatif'/i) end - def dsc_module_import_failure?(what_if_output) - !! (what_if_output =~ /\sCimException/ && - what_if_output =~ /ProviderOperationExecutionFailure/ && - what_if_output =~ /\smodule\s+is\s+installed/) + def dsc_module_import_failure?(command_output) + !! (command_output =~ /\sCimException/ && + command_output =~ /ProviderOperationExecutionFailure/ && + command_output =~ /\smodule\s+is\s+installed/) end - def configuration_update_required?(what_if_output) - Chef::Log.debug("DSC: DSC returned the following '-whatif' output from test operation:\n#{what_if_output}") + def configuration_update_required?(command_output) + Chef::Log.debug("DSC: DSC returned the following '-whatif' output from test operation:\n#{command_output}") begin - Parser.parse(what_if_output) + Parser.parse(command_output, ps_version_gte_5?) rescue Chef::Exceptions::LCMParser => e Chef::Log.warn("Could not parse LCM output: #{e}") [Chef::Util::DSC::ResourceInfo.new("Unknown DSC Resources", true, ["Unknown changes because LCM output was not parsable."])] |