diff options
Diffstat (limited to 'lib/leap_cli/config/manager.rb')
-rw-r--r-- | lib/leap_cli/config/manager.rb | 149 |
1 files changed, 79 insertions, 70 deletions
diff --git a/lib/leap_cli/config/manager.rb b/lib/leap_cli/config/manager.rb index 7b3fb27..be95831 100644 --- a/lib/leap_cli/config/manager.rb +++ b/lib/leap_cli/config/manager.rb @@ -20,6 +20,16 @@ module LeapCli def initialize @environments = {} # hash of `Environment` objects, keyed by name. + + # load macros and other custom ruby in provider base + platform_ruby_files = Dir[Path.provider_base + '/lib/*.rb'] + if platform_ruby_files.any? + $: << Path.provider_base + '/lib' + platform_ruby_files.each do |rb_file| + require rb_file + end + end + Config::Object.send(:include, LeapCli::Macro) end ## @@ -54,9 +64,24 @@ module LeapCli e end - def services; env('default').services; end - def tags; env('default').tags; end - def provider; env('default').provider; end + # + # The default accessors for services, tags, and provider. + # For these defaults, use 'default' environment, or whatever + # environment is pinned. + # + def services + env(default_environment).services + end + def tags + env(default_environment).tags + end + def provider + env(default_environment).provider + end + + def default_environment + LeapCli.leapfile.environment + end ## ## IMPORT EXPORT @@ -80,8 +105,8 @@ module LeapCli @secrets = load_json( Path.named_path(:secrets_config, @provider_dir), Config::Secrets) @common.inherit_from! @base_common - # load provider services, tags, and provider.json, DEFAULT environment - log 3, :loading, 'default environment.........' + # For the default environment, load provider services, tags, and provider.json + log 3, :loading, 'default environment...' env('default') do |e| e.services = load_all_json(Path.named_path([:service_config, '*'], @provider_dir), Config::Tag, :no_dots => true) e.tags = load_all_json(Path.named_path([:tag_config, '*'], @provider_dir), Config::Tag, :no_dots => true) @@ -92,17 +117,28 @@ module LeapCli validate_provider(e.provider) end - # load provider services, tags, and provider.json, OTHER environments + # create a special '_all_' environment, used for tracking the union + # of all the environments + env('_all_') do |e| + e.services = Config::ObjectList.new + e.tags = Config::ObjectList.new + e.provider = Config::Provider.new + e.services.inherit_from! env('default').services + e.tags.inherit_from! env('default').tags + e.provider.inherit_from! env('default').provider + end + + # For each defined environment, load provider services, tags, and provider.json. environment_names.each do |ename| next unless ename - log 3, :loading, '%s environment.........' % ename + log 3, :loading, '%s environment...' % ename env(ename) do |e| e.services = load_all_json(Path.named_path([:service_env_config, '*', ename], @provider_dir), Config::Tag) e.tags = load_all_json(Path.named_path([:tag_env_config, '*', ename], @provider_dir), Config::Tag) e.provider = load_json( Path.named_path([:provider_env_config, ename], @provider_dir), Config::Provider) - e.services.inherit_from! env.services - e.tags.inherit_from! env.tags - e.provider.inherit_from! env.provider + e.services.inherit_from! env('default').services + e.tags.inherit_from! env('default').tags + e.provider.inherit_from! env('default').provider validate_provider(e.provider) end end @@ -113,15 +149,21 @@ module LeapCli @nodes[name] = apply_inheritance(node) end - # remove disabled nodes - unless options[:include_disabled] - remove_disabled_nodes - end + # do some node-list post-processing + cleanup_node_lists(options) # apply control files @nodes.each do |name, node| control_files(node).each do |file| - node.instance_eval File.read(file), file, 1 + begin + node.eval_file file + rescue ConfigError => exc + if options[:continue_on_error] + exc.log + else + raise exc + end + end end end end @@ -187,42 +229,19 @@ module LeapCli # returns a node list consisting only of nodes that satisfy the filter criteria. # # filter: condition [condition] [condition] [+condition] - # condition: [node_name | service_name | tag_name] + # condition: [node_name | service_name | tag_name | environment_name] # # if conditions is prefixed with +, then it works like an AND. Otherwise, it works like an OR. # + # args: + # filter -- array of filter terms, one per item + # # options: # :local -- if :local is false and the filter is empty, then local nodes are excluded. + # :nopin -- if true, ignore environment pinning # - def filter(filters, options={}) - if filters.empty? - if options[:local] === false - return nodes[:environment => '!local'] - else - return nodes - end - end - if filters[0] =~ /^\+/ - # don't let the first filter have a + prefix - filters[0] = filters[0][1..-1] - end - - node_list = Config::ObjectList.new - filters.each do |filter| - if filter =~ /^\+/ - keep_list = nodes_for_name(filter[1..-1]) - node_list.delete_if do |name, node| - if keep_list[name] - false - else - true - end - end - else - node_list.merge!(nodes_for_name(filter)) - end - end - return node_list + def filter(filters=nil, options={}) + Filter.new(filters, options, self).nodes() end # @@ -396,7 +415,6 @@ module LeapCli raise LeapCli::ConfigError.new(node, "error " + msg) if throw_exceptions else new_node.deep_merge!(service) - self.services[node_service].node_list.add(name, new_node) end end end @@ -414,7 +432,6 @@ module LeapCli raise LeapCli::ConfigError.new(node, "error " + msg) if throw_exceptions else new_node.deep_merge!(tag) - self.tags[node_tag].node_list.add(name, new_node) end end end @@ -428,43 +445,35 @@ module LeapCli apply_inheritance(node, true) end - def remove_disabled_nodes + # + # does some final clean at the end of loading nodes. + # this includes removing disabled nodes, and populating + # the services[x].node_list and tags[x].node_list + # + def cleanup_node_lists(options) @disabled_nodes = Config::ObjectList.new @nodes.each do |name, node| - unless node.enabled - log 2, :skipping, "disabled node #{name}." - @nodes.delete(name) - @disabled_nodes[name] = node + if node.enabled || options[:include_disabled] if node['services'] node['services'].to_a.each do |node_service| - self.services[node_service].node_list.delete(node.name) + env(node.environment).services[node_service].node_list.add(node.name, node) + env('_all_').services[node_service].node_list.add(node.name, node) end end if node['tags'] node['tags'].to_a.each do |node_tag| - self.tags[node_tag].node_list.delete(node.name) + env(node.environment).tags[node_tag].node_list.add(node.name, node) + env('_all_').tags[node_tag].node_list.add(node.name, node) end end + elsif !options[:include_disabled] + log 2, :skipping, "disabled node #{name}." + @nodes.delete(name) + @disabled_nodes[name] = node end end end - - # - # returns a set of nodes corresponding to a single name, where name could be a node name, service name, or tag name. - # - def nodes_for_name(name) - if node = self.nodes[name] - Config::ObjectList.new(node) - elsif service = self.services[name] - service.node_list - elsif tag = self.tags[name] - tag.node_list - else - {} - end - end - def validate_provider(provider) # nothing yet. end |