lib/chef-dk/exceptions.rb in chef-dk-0.9.0 vs lib/chef-dk/exceptions.rb in chef-dk-0.10.0

- old
+ new

@@ -1,113 +1,126 @@ -# -# Copyright:: Copyright (c) 2014 Chef Software Inc. -# License:: Apache License, Version 2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -module ChefDK - - class CachedCookbookNotFound < StandardError - end - - class LocalCookbookNotFound < StandardError - end - - class MalformedCookbook < StandardError - end - - class DependencyConflict < StandardError - end - - class CookbookNotInWorkingSet < DependencyConflict - end - - class InvalidCookbookLockData < StandardError - end - - class CachedCookbookModified < StandardError - end - - class InvalidPolicyfileAttribute < StandardError - end - - class MissingComponentError < RuntimeError - def initialize(component_name, path_checked) - super("Component #{component_name} is missing. \nReason: Could not find #{path_checked}.") - end - end - - class OmnibusInstallNotFound < RuntimeError - def initialize() - super("Can not find omnibus installation directory for Chef.") - end - end - - class UnsupportedFeature < StandardError - end - - class PolicyfileError < StandardError - end - - class MissingCookbookLockData < StandardError - end - - class InvalidLockfile < StandardError - end - - class InvalidPolicyfileFilename < StandardError - end - - class InvalidUndoRecord < StandardError - end - - class CantUndo < StandardError - end - - class UndoRecordNotFound < StandardError - end - - class MultipleErrors < StandardError - end - - class BUG < RuntimeError - end - - class CookbookSourceConflict < StandardError - - attr_reader :conflicting_cookbooks - - attr_reader :cookbook_sources - - def initialize(conflicting_cookbooks, cookbook_sources) - @conflicting_cookbooks = conflicting_cookbooks - @cookbook_sources = cookbook_sources - super(compute_message) - end - - private - - def compute_message - conflicting_cookbook_sets = cookbook_sources.combination(2).map do |source_a, source_b| - overlapping_cookbooks = conflicting_cookbooks.select do |cookbook_name| - source_a.universe_graph.key?(cookbook_name) && source_b.universe_graph.key?(cookbook_name) - end - "Source #{source_a.desc} and #{source_b.desc} contain conflicting cookbooks:\n" + - overlapping_cookbooks.sort.map {|c| "- #{c}"}.join("\n") - end - conflicting_cookbook_sets.join("\n") + "\n" - end - - end - -end +# +# Copyright:: Copyright (c) 2014 Chef Software Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +module ChefDK + + class CachedCookbookNotFound < StandardError + end + + class LocalCookbookNotFound < StandardError + end + + class MalformedCookbook < StandardError + end + + class DependencyConflict < StandardError + end + + class CookbookNotInWorkingSet < DependencyConflict + end + + class InvalidCookbookLockData < StandardError + end + + class CachedCookbookModified < StandardError + end + + class InvalidPolicyfileAttribute < StandardError + end + + class MissingComponentError < RuntimeError + def initialize(component_name, reason) + super("Component #{component_name} is missing.\nReason: #{reason}") + end + end + + class OmnibusInstallNotFound < RuntimeError + def initialize() + super("Can not find omnibus installation directory for Chef.") + end + end + + class UnsupportedFeature < StandardError + end + + class PolicyfileError < StandardError + end + + class MissingCookbookLockData < StandardError + end + + class InvalidLockfile < StandardError + end + + class InvalidPolicyfileFilename < StandardError + end + + class InvalidUndoRecord < StandardError + end + + class CantUndo < StandardError + end + + class UndoRecordNotFound < StandardError + end + + class MultipleErrors < StandardError + end + + class BUG < RuntimeError + end + + class CookbookSourceConflict < StandardError + + attr_reader :conflicting_cookbooks + + attr_reader :cookbook_sources + + def initialize(conflicting_cookbooks, cookbook_sources) + @conflicting_cookbooks = conflicting_cookbooks + @cookbook_sources = cookbook_sources + super(compute_message) + end + + private + + def compute_message + conflicting_cookbook_sets = cookbook_sources.combination(2).map do |source_a, source_b| + overlapping_cookbooks = conflicting_cookbooks.select do |cookbook_name| + source_a.universe_graph.key?(cookbook_name) && source_b.universe_graph.key?(cookbook_name) + end + "Source #{source_a.desc} and #{source_b.desc} contain conflicting cookbooks:\n" + + overlapping_cookbooks.sort.map {|c| "- #{c}"}.join("\n") + "\n\n" + + resolution_message(overlapping_cookbooks) + end + conflicting_cookbook_sets.join("\n") + end + + def resolution_message(overlapping_cookbooks) + example_source = cookbook_sources.first + source_key, location = example_source.default_source_args + <<-EXAMPLE +You can set a preferred source to resolve this issue with code like: + +default_source :#{source_key}, "#{location}" do |s| + s.preferred_for "#{overlapping_cookbooks.join('", "')}" +end +EXAMPLE + end + + end + +end