lib/r10k/deployment.rb in r10k-1.3.5 vs lib/r10k/deployment.rb in r10k-1.4.0
- old
+ new
@@ -1,74 +1,129 @@
-require 'yaml'
-require 'r10k'
require 'r10k/source'
+require 'r10k/util/basedir'
+require 'r10k/errors'
+require 'set'
module R10K
-class Deployment
- # Model a full installation of module directories and modules.
+ # A deployment models the entire state of the configuration that a Puppet
+ # master can use. It contains a set of sources that can produce environments
+ # and manages the contents of directories where environments are deployed.
+ #
+ # @api private
+ class Deployment
- require 'r10k/deployment/environment'
- require 'r10k/deployment/basedir'
- require 'r10k/deployment/source'
- require 'r10k/deployment/config'
+ require 'r10k/deployment/environment'
+ require 'r10k/deployment/basedir'
+ require 'r10k/deployment/source'
+ require 'r10k/deployment/config'
- # Generate a deployment object based on a config
- #
- # @param path [String] The path to the deployment config
- # @return [R10K::Deployment] The deployment loaded with the given config
- def self.load_config(path)
- config = R10K::Deployment::Config.new(path)
- new(config)
- end
+ # Generate a deployment object based on a config
+ #
+ # @param path [String] The path to the deployment config
+ # @return [R10K::Deployment] The deployment loaded with the given config
+ def self.load_config(path)
+ config = R10K::Deployment::Config.new(path)
+ new(config)
+ end
- def initialize(config)
- @config = config
- end
+ # @!attribute [r] config
+ # @return [R10K::Deployment::Config]
+ attr_reader :config
- def preload!
- sources.each(&:preload!)
- end
- alias fetch_sources preload!
+ def initialize(config)
+ @config = config
+ end
- # Lazily load all sources
- #
- # This instantiates the @_sources instance variable, but should not be
- # used directly as it could be legitimately unset if we're doing lazy
- # loading.
- #
- # @return [Array<R10K::Source::Base>] All repository sources
- # specified in the config
- def sources
- load_sources if @_sources.nil?
- @_sources
- end
+ def preload!
+ sources.each(&:preload!)
+ end
- # Lazily load all environments
- #
- # This instantiates the @_environments instance variable, but should not be
- # used directly as it could be legitimately unset if we're doing lazy
- # loading.
- #
- # @return [Array<R10K::Environment::Base>] All enviroments across
- # all sources
- def environments
- load_environments if @_environments.nil?
- @_environments
- end
+ # @deprecated
+ alias fetch_sources preload!
- private
+ # Lazily load all sources
+ #
+ # This instantiates the @_sources instance variable, but should not be
+ # used directly as it could be legitimately unset if we're doing lazy
+ # loading.
+ #
+ # @return [Array<R10K::Source::Base>] All repository sources
+ # specified in the config
+ def sources
+ load_sources if @_sources.nil?
+ @_sources
+ end
- def load_sources
- sources = @config.setting(:sources)
- @_sources = sources.map do |(name, hash)|
- R10K::Source.from_hash(name, hash)
+ # Lazily load all environments
+ #
+ # This instantiates the @_environments instance variable, but should not be
+ # used directly as it could be legitimately unset if we're doing lazy
+ # loading.
+ #
+ # @return [Array<R10K::Environment::Base>] All enviroments across
+ # all sources
+ def environments
+ load_environments if @_environments.nil?
+ @_environments
end
- end
- def load_environments
- @_environments = []
- sources.each do |source|
- @_environments += source.environments
+ # @return [Array<String>] The paths used by all contained sources
+ def paths
+ paths_and_sources.keys
end
+
+ # @return [Hash<String, Array<R10K::Source::Base>]
+ def paths_and_sources
+ pathmap = Hash.new { |h, k| h[k] = [] }
+ sources.each { |source| pathmap[source.basedir] << source }
+ pathmap
+ end
+
+ # Remove unmanaged content from all source paths
+ def purge!
+ paths_and_sources.each_pair do |path, sources_at_path|
+ R10K::Util::Basedir.new(path, sources_at_path).purge!
+ end
+ end
+
+ def validate!
+ hash = {}
+ sources.each do |source|
+ source.environments.each do |environment|
+ if hash.key?(environment.path)
+ osource, oenvironment = hash[environment.path]
+ msg = ""
+ msg << "Environment collision at #{environment.path} between "
+ msg << "#{source.name}:#{environment.name} and #{osource.name}:#{oenvironment.name}"
+ raise R10K::R10KError, msg
+ else
+ hash[environment.path] = [source, environment]
+ end
+ end
+ end
+ end
+
+ def accept(visitor)
+ visitor.visit(:deployment, self) do
+ sources.each do |env|
+ env.accept(visitor)
+ end
+ end
+ end
+
+ private
+
+ def load_sources
+ sources = @config.setting(:sources)
+ @_sources = sources.map do |(name, hash)|
+ R10K::Source.from_hash(name, hash)
+ end
+ end
+
+ def load_environments
+ @_environments = []
+ sources.each do |source|
+ @_environments += source.environments
+ end
+ end
end
-end
end