ridley 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.rbenv-version +1 -0
 - data/.travis.yml +1 -0
 - data/Gemfile +46 -1
 - data/Guardfile +0 -1
 - data/README.md +15 -0
 - data/Thorfile +18 -15
 - data/bootstrappers/omnibus.erb +73 -0
 - data/lib/ridley/bootstrapper/context.rb +172 -0
 - data/lib/ridley/bootstrapper.rb +99 -0
 - data/lib/ridley/chain_link.rb +25 -0
 - data/lib/ridley/connection.rb +27 -5
 - data/lib/ridley/errors.rb +6 -1
 - data/lib/ridley/logging.rb +30 -0
 - data/lib/ridley/resources/client.rb +3 -3
 - data/lib/ridley/resources/cookbook.rb +3 -3
 - data/lib/ridley/resources/data_bag.rb +8 -8
 - data/lib/ridley/resources/environment.rb +3 -3
 - data/lib/ridley/resources/node.rb +57 -3
 - data/lib/ridley/resources/role.rb +3 -3
 - data/lib/ridley/resources/sandbox.rb +3 -3
 - data/lib/ridley/ssh/response.rb +13 -0
 - data/lib/ridley/ssh/response_set.rb +51 -0
 - data/lib/ridley/ssh/worker.rb +71 -0
 - data/lib/ridley/ssh.rb +74 -0
 - data/lib/ridley/version.rb +1 -1
 - data/lib/ridley.rb +42 -17
 - data/ridley.gemspec +6 -17
 - data/spec/acceptance/bootstrapping_spec.rb +29 -0
 - data/spec/spec_helper.rb +19 -3
 - data/spec/unit/ridley/bootstrapper/context_spec.rb +119 -0
 - data/spec/unit/ridley/bootstrapper_spec.rb +86 -0
 - data/spec/unit/ridley/resources/node_spec.rb +41 -1
 - data/spec/unit/ridley/ssh_spec.rb +31 -0
 - data/spec/unit/ridley_spec.rb +0 -6
 - metadata +42 -185
 - data/lib/ridley/context.rb +0 -25
 
    
        data/.rbenv-version
    ADDED
    
    | 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            1.9.3-p286
         
     | 
    
        data/.travis.yml
    CHANGED
    
    
    
        data/Gemfile
    CHANGED
    
    | 
         @@ -1,3 +1,48 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            source  
     | 
| 
      
 1 
     | 
    
         
            +
            source :rubygems
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            gemspec
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            platforms :jruby do
         
     | 
| 
      
 6 
     | 
    
         
            +
              gem 'jruby-openssl'
         
     | 
| 
      
 7 
     | 
    
         
            +
            end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            group :development do
         
     | 
| 
      
 10 
     | 
    
         
            +
              gem 'yard'
         
     | 
| 
      
 11 
     | 
    
         
            +
              gem 'spork'
         
     | 
| 
      
 12 
     | 
    
         
            +
              gem 'guard', '>= 1.5.0'
         
     | 
| 
      
 13 
     | 
    
         
            +
              gem 'guard-yard'
         
     | 
| 
      
 14 
     | 
    
         
            +
              gem 'guard-rspec'
         
     | 
| 
      
 15 
     | 
    
         
            +
              gem 'guard-spork', platforms: :ruby
         
     | 
| 
      
 16 
     | 
    
         
            +
              gem 'coolline'
         
     | 
| 
      
 17 
     | 
    
         
            +
              gem 'redcarpet', platforms: :ruby
         
     | 
| 
      
 18 
     | 
    
         
            +
              gem 'kramdown', platforms: :jruby
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              require 'rbconfig'
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              if RbConfig::CONFIG['target_os'] =~ /darwin/i
         
     | 
| 
      
 23 
     | 
    
         
            +
                gem 'growl', require: false
         
     | 
| 
      
 24 
     | 
    
         
            +
                gem 'rb-fsevent', require: false
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                if `uname`.strip == 'Darwin' && `sw_vers -productVersion`.strip >= '10.8'
         
     | 
| 
      
 27 
     | 
    
         
            +
                  gem 'terminal-notifier-guard', '~> 1.5.3', require: false
         
     | 
| 
      
 28 
     | 
    
         
            +
                end rescue Errno::ENOENT
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              elsif RbConfig::CONFIG['target_os'] =~ /linux/i
         
     | 
| 
      
 31 
     | 
    
         
            +
                gem 'libnotify',  '~> 0.8.0', require: false
         
     | 
| 
      
 32 
     | 
    
         
            +
                gem 'rb-inotify', require: false
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
              elsif RbConfig::CONFIG['target_os'] =~ /mswin|mingw/i
         
     | 
| 
      
 35 
     | 
    
         
            +
                gem 'win32console', require: false
         
     | 
| 
      
 36 
     | 
    
         
            +
                gem 'rb-notifu', '>= 0.0.4', require: false
         
     | 
| 
      
 37 
     | 
    
         
            +
                gem 'wdm', require: false
         
     | 
| 
      
 38 
     | 
    
         
            +
              end
         
     | 
| 
      
 39 
     | 
    
         
            +
            end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            group :test do
         
     | 
| 
      
 42 
     | 
    
         
            +
              gem 'thor'
         
     | 
| 
      
 43 
     | 
    
         
            +
              gem 'rake', '>= 0.9.2.2'
         
     | 
| 
      
 44 
     | 
    
         
            +
              gem 'rspec'
         
     | 
| 
      
 45 
     | 
    
         
            +
              gem 'fuubar'
         
     | 
| 
      
 46 
     | 
    
         
            +
              gem 'json_spec'
         
     | 
| 
      
 47 
     | 
    
         
            +
              gem 'webmock'
         
     | 
| 
      
 48 
     | 
    
         
            +
            end
         
     | 
    
        data/Guardfile
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | 
         @@ -345,6 +345,21 @@ And the same goes for setting an environment level override attribute 
     | 
|
| 
       345 
345 
     | 
    
         
             
                  obj.save
         
     | 
| 
       346 
346 
     | 
    
         
             
                end
         
     | 
| 
       347 
347 
     | 
    
         | 
| 
      
 348 
     | 
    
         
            +
            ## Bootstrapping nodes
         
     | 
| 
      
 349 
     | 
    
         
            +
             
     | 
| 
      
 350 
     | 
    
         
            +
                conn = Ridley.connection(
         
     | 
| 
      
 351 
     | 
    
         
            +
                  server_url: "https://api.opscode.com",
         
     | 
| 
      
 352 
     | 
    
         
            +
                  organization: "vialstudios",
         
     | 
| 
      
 353 
     | 
    
         
            +
                  validator_client: "vialstudios-validator",
         
     | 
| 
      
 354 
     | 
    
         
            +
                  validator_path: "/Users/reset/.chef/vialstudios-validator.pem",
         
     | 
| 
      
 355 
     | 
    
         
            +
                  ssh: {
         
     | 
| 
      
 356 
     | 
    
         
            +
                    user: "vagrant",
         
     | 
| 
      
 357 
     | 
    
         
            +
                    password: "vagrant"
         
     | 
| 
      
 358 
     | 
    
         
            +
                  }
         
     | 
| 
      
 359 
     | 
    
         
            +
                )
         
     | 
| 
      
 360 
     | 
    
         
            +
             
     | 
| 
      
 361 
     | 
    
         
            +
                conn.node.bootstrap("33.33.33.10", "33.33.33.11")
         
     | 
| 
      
 362 
     | 
    
         
            +
             
     | 
| 
       348 
363 
     | 
    
         
             
            # Authors and Contributors
         
     | 
| 
       349 
364 
     | 
    
         | 
| 
       350 
365 
     | 
    
         
             
            * Jamie Winsor (<jamie@vialstudios.com>)
         
     | 
    
        data/Thorfile
    CHANGED
    
    | 
         @@ -5,25 +5,28 @@ require 'bundler' 
     | 
|
| 
       5 
5 
     | 
    
         
             
            require 'bundler/setup'
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
            require 'ridley'
         
     | 
| 
       8 
     | 
    
         
            -
            require 'thor/rake_compat'
         
     | 
| 
       9 
8 
     | 
    
         | 
| 
       10 
9 
     | 
    
         
             
            class Default < Thor
         
     | 
| 
       11 
     | 
    
         
            -
               
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
      
 10 
     | 
    
         
            +
              unless jruby?
         
     | 
| 
      
 11 
     | 
    
         
            +
                require 'thor/rake_compat'
         
     | 
| 
      
 12 
     | 
    
         
            +
                
         
     | 
| 
      
 13 
     | 
    
         
            +
                include Thor::RakeCompat
         
     | 
| 
      
 14 
     | 
    
         
            +
                Bundler::GemHelper.install_tasks
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                desc "build", "Build ridley-#{Ridley::VERSION}.gem into the pkg directory"
         
     | 
| 
      
 17 
     | 
    
         
            +
                def build
         
     | 
| 
      
 18 
     | 
    
         
            +
                  Rake::Task["build"].execute
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
       18 
20 
     | 
    
         | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
      
 21 
     | 
    
         
            +
                desc "install", "Build and install ridley-#{Ridley::VERSION}.gem into system gems"
         
     | 
| 
      
 22 
     | 
    
         
            +
                def install
         
     | 
| 
      
 23 
     | 
    
         
            +
                  Rake::Task["install"].execute
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
       23 
25 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
      
 26 
     | 
    
         
            +
                desc "release", "Create tag v#{Ridley::VERSION} and build and push ridley-#{Ridley::VERSION}.gem to Rubygems"
         
     | 
| 
      
 27 
     | 
    
         
            +
                def release
         
     | 
| 
      
 28 
     | 
    
         
            +
                  Rake::Task["release"].execute
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
       27 
30 
     | 
    
         
             
              end
         
     | 
| 
       28 
31 
     | 
    
         | 
| 
       29 
32 
     | 
    
         
             
              class Spec < Thor
         
     | 
| 
         @@ -0,0 +1,73 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            bash -c '
         
     | 
| 
      
 2 
     | 
    
         
            +
            <%= "export http_proxy=\"#{bootstrap_proxy}\"" if bootstrap_proxy -%>
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            exists() {
         
     | 
| 
      
 5 
     | 
    
         
            +
              if command -v $1 &>/dev/null
         
     | 
| 
      
 6 
     | 
    
         
            +
              then
         
     | 
| 
      
 7 
     | 
    
         
            +
                return 0
         
     | 
| 
      
 8 
     | 
    
         
            +
              else
         
     | 
| 
      
 9 
     | 
    
         
            +
                return 1
         
     | 
| 
      
 10 
     | 
    
         
            +
              fi
         
     | 
| 
      
 11 
     | 
    
         
            +
            }
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            install_sh="http://opscode.com/chef/install.sh"
         
     | 
| 
      
 14 
     | 
    
         
            +
            version_string="-v <%= chef_version %>"
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            if ! exists /usr/bin/chef-client; then
         
     | 
| 
      
 17 
     | 
    
         
            +
              if exists wget; then
         
     | 
| 
      
 18 
     | 
    
         
            +
                bash <(wget <%= "--proxy=on " if bootstrap_proxy %> ${install_sh} -O -) ${version_string}
         
     | 
| 
      
 19 
     | 
    
         
            +
              else
         
     | 
| 
      
 20 
     | 
    
         
            +
                if exists curl; then
         
     | 
| 
      
 21 
     | 
    
         
            +
                  bash <(curl -L <%= "--proxy=on " if bootstrap_proxy %> ${install_sh}) ${version_string}
         
     | 
| 
      
 22 
     | 
    
         
            +
                fi
         
     | 
| 
      
 23 
     | 
    
         
            +
              fi
         
     | 
| 
      
 24 
     | 
    
         
            +
            fi
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            mkdir -p /etc/chef
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            (
         
     | 
| 
      
 29 
     | 
    
         
            +
            cat <<'EOP'
         
     | 
| 
      
 30 
     | 
    
         
            +
            <%= validation_key %>
         
     | 
| 
      
 31 
     | 
    
         
            +
            EOP
         
     | 
| 
      
 32 
     | 
    
         
            +
            ) > /tmp/validation.pem
         
     | 
| 
      
 33 
     | 
    
         
            +
            awk NF /tmp/validation.pem > /etc/chef/validation.pem
         
     | 
| 
      
 34 
     | 
    
         
            +
            rm /tmp/validation.pem
         
     | 
| 
      
 35 
     | 
    
         
            +
            chmod 0600 /etc/chef/validation.pem
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
            <% if encrypted_data_bag_secret -%>
         
     | 
| 
      
 38 
     | 
    
         
            +
            (
         
     | 
| 
      
 39 
     | 
    
         
            +
            cat <<'EOP'
         
     | 
| 
      
 40 
     | 
    
         
            +
            <%= encrypted_data_bag_secret %>
         
     | 
| 
      
 41 
     | 
    
         
            +
            EOP
         
     | 
| 
      
 42 
     | 
    
         
            +
            ) > /tmp/encrypted_data_bag_secret
         
     | 
| 
      
 43 
     | 
    
         
            +
            awk NF /tmp/encrypted_data_bag_secret > /etc/chef/encrypted_data_bag_secret
         
     | 
| 
      
 44 
     | 
    
         
            +
            rm /tmp/encrypted_data_bag_secret
         
     | 
| 
      
 45 
     | 
    
         
            +
            chmod 0600 /etc/chef/encrypted_data_bag_secret
         
     | 
| 
      
 46 
     | 
    
         
            +
            <% end -%>
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
            <%# Generate Ohai Hints -%>
         
     | 
| 
      
 49 
     | 
    
         
            +
            <% unless hints.empty? -%>
         
     | 
| 
      
 50 
     | 
    
         
            +
            mkdir -p /etc/chef/ohai/hints
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
            <% hints.each do |name, hash| -%>
         
     | 
| 
      
 53 
     | 
    
         
            +
            (
         
     | 
| 
      
 54 
     | 
    
         
            +
            cat <<'EOP'
         
     | 
| 
      
 55 
     | 
    
         
            +
            <%= hash.to_json %>
         
     | 
| 
      
 56 
     | 
    
         
            +
            EOP
         
     | 
| 
      
 57 
     | 
    
         
            +
            ) > /etc/chef/ohai/hints/<%= name %>.json
         
     | 
| 
      
 58 
     | 
    
         
            +
            <% end -%>
         
     | 
| 
      
 59 
     | 
    
         
            +
            <% end -%>
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
            (
         
     | 
| 
      
 62 
     | 
    
         
            +
            cat <<'EOP'
         
     | 
| 
      
 63 
     | 
    
         
            +
            <%= chef_config %>
         
     | 
| 
      
 64 
     | 
    
         
            +
            EOP
         
     | 
| 
      
 65 
     | 
    
         
            +
            ) > /etc/chef/client.rb
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
            (
         
     | 
| 
      
 68 
     | 
    
         
            +
            cat <<'EOP'
         
     | 
| 
      
 69 
     | 
    
         
            +
            <%= first_boot %>
         
     | 
| 
      
 70 
     | 
    
         
            +
            EOP
         
     | 
| 
      
 71 
     | 
    
         
            +
            ) > /etc/chef/first-boot.json
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
            <%= chef_run %>'
         
     | 
| 
         @@ -0,0 +1,172 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'erubis'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Ridley
         
     | 
| 
      
 4 
     | 
    
         
            +
              class Bootstrapper
         
     | 
| 
      
 5 
     | 
    
         
            +
                # @author Jamie Winsor <jamie@vialstudios.com>
         
     | 
| 
      
 6 
     | 
    
         
            +
                class Context
         
     | 
| 
      
 7 
     | 
    
         
            +
                  class << self
         
     | 
| 
      
 8 
     | 
    
         
            +
                    def validate_options(options = {})
         
     | 
| 
      
 9 
     | 
    
         
            +
                      if options[:server_url].nil?
         
     | 
| 
      
 10 
     | 
    
         
            +
                        raise Errors::ArgumentError, "A server_url is required for bootstrapping"
         
     | 
| 
      
 11 
     | 
    
         
            +
                      end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                      if options[:validator_path].nil?
         
     | 
| 
      
 14 
     | 
    
         
            +
                        raise Errors::ArgumentError, "A path to a validator is required for bootstrapping"
         
     | 
| 
      
 15 
     | 
    
         
            +
                      end
         
     | 
| 
      
 16 
     | 
    
         
            +
                    end
         
     | 
| 
      
 17 
     | 
    
         
            +
                  end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 20 
     | 
    
         
            +
                  attr_reader :host
         
     | 
| 
      
 21 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 22 
     | 
    
         
            +
                  attr_reader :node_name
         
     | 
| 
      
 23 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 24 
     | 
    
         
            +
                  attr_reader :server_url
         
     | 
| 
      
 25 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 26 
     | 
    
         
            +
                  attr_reader :validator_client
         
     | 
| 
      
 27 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 28 
     | 
    
         
            +
                  attr_reader :validator_path
         
     | 
| 
      
 29 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 30 
     | 
    
         
            +
                  attr_reader :bootstrap_proxy
         
     | 
| 
      
 31 
     | 
    
         
            +
                  # @return [Hash]
         
     | 
| 
      
 32 
     | 
    
         
            +
                  attr_reader :hints
         
     | 
| 
      
 33 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 34 
     | 
    
         
            +
                  attr_reader :chef_version
         
     | 
| 
      
 35 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 36 
     | 
    
         
            +
                  attr_reader :environment
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                  # @param [String] host
         
     | 
| 
      
 39 
     | 
    
         
            +
                  #   name of the node as identified in Chef
         
     | 
| 
      
 40 
     | 
    
         
            +
                  # @option options [String] :validator_path
         
     | 
| 
      
 41 
     | 
    
         
            +
                  #   filepath to the validator used to bootstrap the node (required)
         
     | 
| 
      
 42 
     | 
    
         
            +
                  # @option options [String] :node_name
         
     | 
| 
      
 43 
     | 
    
         
            +
                  # @option options [String] :server_url
         
     | 
| 
      
 44 
     | 
    
         
            +
                  # @option options [String] :validator_client
         
     | 
| 
      
 45 
     | 
    
         
            +
                  # @option options [String] :bootstrap_proxy
         
     | 
| 
      
 46 
     | 
    
         
            +
                  #   URL to a proxy server to bootstrap through (default: nil)
         
     | 
| 
      
 47 
     | 
    
         
            +
                  # @option options [String] :encrypted_data_bag_secret_path
         
     | 
| 
      
 48 
     | 
    
         
            +
                  #   filepath on your host machine to your organizations encrypted data bag secret (default: nil)
         
     | 
| 
      
 49 
     | 
    
         
            +
                  # @option options [Hash] :hints
         
     | 
| 
      
 50 
     | 
    
         
            +
                  #   a hash of Ohai hints to place on the bootstrapped node (default: Hash.new)
         
     | 
| 
      
 51 
     | 
    
         
            +
                  # @option options [Hash] :attributes
         
     | 
| 
      
 52 
     | 
    
         
            +
                  #   a hash of attributes to use in the first Chef run (default: Hash.new)
         
     | 
| 
      
 53 
     | 
    
         
            +
                  # @option options [Array] :run_list
         
     | 
| 
      
 54 
     | 
    
         
            +
                  #   an initial run list to bootstrap with (default: Array.new)
         
     | 
| 
      
 55 
     | 
    
         
            +
                  # @option options [String] :chef_version
         
     | 
| 
      
 56 
     | 
    
         
            +
                  #   version of Chef to install on the node (default: {Ridley::CHEF_VERSION})
         
     | 
| 
      
 57 
     | 
    
         
            +
                  # @option options [String] :environment
         
     | 
| 
      
 58 
     | 
    
         
            +
                  #   environment to join the node to (default: '_default')
         
     | 
| 
      
 59 
     | 
    
         
            +
                  # @option options [Boolean] :sudo
         
     | 
| 
      
 60 
     | 
    
         
            +
                  #   bootstrap with sudo (default: true)
         
     | 
| 
      
 61 
     | 
    
         
            +
                  # @option options [String] :template
         
     | 
| 
      
 62 
     | 
    
         
            +
                  #   bootstrap template to use (default: omnibus)
         
     | 
| 
      
 63 
     | 
    
         
            +
                  def initialize(host, options = {})
         
     | 
| 
      
 64 
     | 
    
         
            +
                    self.class.validate_options(options)
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                    @host                           = host
         
     | 
| 
      
 67 
     | 
    
         
            +
                    @server_url                     = options[:server_url]
         
     | 
| 
      
 68 
     | 
    
         
            +
                    @validator_path                 = options[:validator_path]
         
     | 
| 
      
 69 
     | 
    
         
            +
                    @node_name                      = options[:node_name]
         
     | 
| 
      
 70 
     | 
    
         
            +
                    @validator_client               = options[:validator_client] || "chef-validator"
         
     | 
| 
      
 71 
     | 
    
         
            +
                    @bootstrap_proxy                = options[:bootstrap_proxy]
         
     | 
| 
      
 72 
     | 
    
         
            +
                    @encrypted_data_bag_secret_path = options[:encrypted_data_bag_secret_path]
         
     | 
| 
      
 73 
     | 
    
         
            +
                    @hints                          = options[:hints] || Hash.new
         
     | 
| 
      
 74 
     | 
    
         
            +
                    @attributes                     = options[:attributes] || Hash.new
         
     | 
| 
      
 75 
     | 
    
         
            +
                    @run_list                       = options[:run_list] || Array.new
         
     | 
| 
      
 76 
     | 
    
         
            +
                    @chef_version                   = options[:chef_version] || Ridley::CHEF_VERSION
         
     | 
| 
      
 77 
     | 
    
         
            +
                    @environment                    = options[:environment] || "_default"
         
     | 
| 
      
 78 
     | 
    
         
            +
                    @sudo                           = options[:sudo] || true
         
     | 
| 
      
 79 
     | 
    
         
            +
                    @template_file                  = options[:template] || Bootstrapper.default_template
         
     | 
| 
      
 80 
     | 
    
         
            +
                  end
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 83 
     | 
    
         
            +
                  def boot_command
         
     | 
| 
      
 84 
     | 
    
         
            +
                    cmd = template.evaluate(self)
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
                    if sudo
         
     | 
| 
      
 87 
     | 
    
         
            +
                      cmd = "sudo #{cmd}"
         
     | 
| 
      
 88 
     | 
    
         
            +
                    end
         
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
                    cmd
         
     | 
| 
      
 91 
     | 
    
         
            +
                  end
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 94 
     | 
    
         
            +
                  def clean_command
         
     | 
| 
      
 95 
     | 
    
         
            +
                    "rm /etc/chef/first-boot.json; rm /etc/chef/validation.pem"
         
     | 
| 
      
 96 
     | 
    
         
            +
                  end
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 99 
     | 
    
         
            +
                  def chef_run
         
     | 
| 
      
 100 
     | 
    
         
            +
                    "chef-client -j /etc/chef/first-boot.json -E #{environment}"
         
     | 
| 
      
 101 
     | 
    
         
            +
                  end
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 104 
     | 
    
         
            +
                  def chef_config
         
     | 
| 
      
 105 
     | 
    
         
            +
                    body = <<-CONFIG
         
     | 
| 
      
 106 
     | 
    
         
            +
            log_level        :info
         
     | 
| 
      
 107 
     | 
    
         
            +
            log_location     STDOUT
         
     | 
| 
      
 108 
     | 
    
         
            +
            chef_server_url  "#{server_url}"
         
     | 
| 
      
 109 
     | 
    
         
            +
            validation_client_name "#{validator_client}"
         
     | 
| 
      
 110 
     | 
    
         
            +
            CONFIG
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
                    if node_name.present?
         
     | 
| 
      
 113 
     | 
    
         
            +
                      body << %Q{node_name "#{node_name}"\n}
         
     | 
| 
      
 114 
     | 
    
         
            +
                    else
         
     | 
| 
      
 115 
     | 
    
         
            +
                      body << "# Using default node name (fqdn)\n"
         
     | 
| 
      
 116 
     | 
    
         
            +
                    end
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
                    if bootstrap_proxy.present?
         
     | 
| 
      
 119 
     | 
    
         
            +
                      body << %Q{http_proxy        "#{bootstrap_proxy}"\n}
         
     | 
| 
      
 120 
     | 
    
         
            +
                      body << %Q{https_proxy       "#{bootstrap_proxy}"\n}
         
     | 
| 
      
 121 
     | 
    
         
            +
                    end
         
     | 
| 
      
 122 
     | 
    
         
            +
             
     | 
| 
      
 123 
     | 
    
         
            +
                    if encrypted_data_bag_secret.present?
         
     | 
| 
      
 124 
     | 
    
         
            +
                      body << %Q{encrypted_data_bag_secret "/etc/chef/encrypted_data_bag_secret"\n}
         
     | 
| 
      
 125 
     | 
    
         
            +
                    end
         
     | 
| 
      
 126 
     | 
    
         
            +
             
     | 
| 
      
 127 
     | 
    
         
            +
                    body
         
     | 
| 
      
 128 
     | 
    
         
            +
                  end
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 131 
     | 
    
         
            +
                  def first_boot
         
     | 
| 
      
 132 
     | 
    
         
            +
                    attributes.merge(run_list: run_list).to_json
         
     | 
| 
      
 133 
     | 
    
         
            +
                  end
         
     | 
| 
      
 134 
     | 
    
         
            +
             
     | 
| 
      
 135 
     | 
    
         
            +
                  # The validation key to create a new client for the node
         
     | 
| 
      
 136 
     | 
    
         
            +
                  #
         
     | 
| 
      
 137 
     | 
    
         
            +
                  # @raise [Ridley::Errors::ValidatorNotFound]
         
     | 
| 
      
 138 
     | 
    
         
            +
                  #
         
     | 
| 
      
 139 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 140 
     | 
    
         
            +
                  def validation_key
         
     | 
| 
      
 141 
     | 
    
         
            +
                    IO.read(validator_path).chomp
         
     | 
| 
      
 142 
     | 
    
         
            +
                  rescue Errno::ENOENT
         
     | 
| 
      
 143 
     | 
    
         
            +
                    raise Errors::ValidatorNotFound, "Error bootstrapping: Validator not found at '#{validator_path}'"
         
     | 
| 
      
 144 
     | 
    
         
            +
                  end
         
     | 
| 
      
 145 
     | 
    
         
            +
             
     | 
| 
      
 146 
     | 
    
         
            +
                  # @raise [Ridley::Errors::EncryptedDataBagSecretNotFound]
         
     | 
| 
      
 147 
     | 
    
         
            +
                  #
         
     | 
| 
      
 148 
     | 
    
         
            +
                  # @return [String, nil]
         
     | 
| 
      
 149 
     | 
    
         
            +
                  def encrypted_data_bag_secret
         
     | 
| 
      
 150 
     | 
    
         
            +
                    return nil if encrypted_data_bag_secret_path.nil?
         
     | 
| 
      
 151 
     | 
    
         
            +
             
     | 
| 
      
 152 
     | 
    
         
            +
                    IO.read(encrypted_data_bag_secret_path).chomp
         
     | 
| 
      
 153 
     | 
    
         
            +
                  rescue Errno::ENOENT => encrypted_data_bag_secret
         
     | 
| 
      
 154 
     | 
    
         
            +
                    raise Errors::EncryptedDataBagSecretNotFound, "Error bootstrapping: Encrypted data bag secret provided but not found at '#{encrypted_data_bag_secret_path}"
         
     | 
| 
      
 155 
     | 
    
         
            +
                  end
         
     | 
| 
      
 156 
     | 
    
         
            +
             
     | 
| 
      
 157 
     | 
    
         
            +
                  private
         
     | 
| 
      
 158 
     | 
    
         
            +
             
     | 
| 
      
 159 
     | 
    
         
            +
                    attr_reader :sudo
         
     | 
| 
      
 160 
     | 
    
         
            +
                    attr_reader :template_file
         
     | 
| 
      
 161 
     | 
    
         
            +
                    attr_reader :encrypted_data_bag_secret_path
         
     | 
| 
      
 162 
     | 
    
         
            +
                    attr_reader :validator_path
         
     | 
| 
      
 163 
     | 
    
         
            +
                    attr_reader :run_list
         
     | 
| 
      
 164 
     | 
    
         
            +
                    attr_reader :attributes
         
     | 
| 
      
 165 
     | 
    
         
            +
             
     | 
| 
      
 166 
     | 
    
         
            +
                    # @return [Erubis::Eruby]
         
     | 
| 
      
 167 
     | 
    
         
            +
                    def template
         
     | 
| 
      
 168 
     | 
    
         
            +
                      Erubis::Eruby.new(IO.read(template_file).chomp)
         
     | 
| 
      
 169 
     | 
    
         
            +
                    end
         
     | 
| 
      
 170 
     | 
    
         
            +
                end
         
     | 
| 
      
 171 
     | 
    
         
            +
              end
         
     | 
| 
      
 172 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,99 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Ridley
         
     | 
| 
      
 2 
     | 
    
         
            +
              # @author Jamie Winsor <jamie@vialstudios.com>
         
     | 
| 
      
 3 
     | 
    
         
            +
              class Bootstrapper
         
     | 
| 
      
 4 
     | 
    
         
            +
                autoload :Context, 'ridley/bootstrapper/context'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                class << self
         
     | 
| 
      
 7 
     | 
    
         
            +
                  # @return [Pathname]
         
     | 
| 
      
 8 
     | 
    
         
            +
                  def templates_path
         
     | 
| 
      
 9 
     | 
    
         
            +
                    Ridley.root.join('bootstrappers')
         
     | 
| 
      
 10 
     | 
    
         
            +
                  end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 13 
     | 
    
         
            +
                  def default_template
         
     | 
| 
      
 14 
     | 
    
         
            +
                    templates_path.join('omnibus.erb').to_s
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                include Celluloid
         
     | 
| 
      
 19 
     | 
    
         
            +
                include Celluloid::Logger
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                # @return [Array<String>]
         
     | 
| 
      
 22 
     | 
    
         
            +
                attr_reader :hosts
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                # @return [Array<Bootstrapper::Context>]
         
     | 
| 
      
 25 
     | 
    
         
            +
                attr_reader :contexts
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                # @return [Hash]
         
     | 
| 
      
 28 
     | 
    
         
            +
                attr_reader :ssh_config
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                # @param [Array<#to_s>] hosts
         
     | 
| 
      
 31 
     | 
    
         
            +
                # @option options [String] :ssh_user
         
     | 
| 
      
 32 
     | 
    
         
            +
                # @option options [String] :ssh_password
         
     | 
| 
      
 33 
     | 
    
         
            +
                # @option options [Array<String>, String] :ssh_keys
         
     | 
| 
      
 34 
     | 
    
         
            +
                # @option options [Float] :ssh_timeout
         
     | 
| 
      
 35 
     | 
    
         
            +
                #   timeout value for SSH bootstrap (default: 1.5)
         
     | 
| 
      
 36 
     | 
    
         
            +
                # @option options [String] :validator_client
         
     | 
| 
      
 37 
     | 
    
         
            +
                # @option options [String] :validator_path
         
     | 
| 
      
 38 
     | 
    
         
            +
                #   filepath to the validator used to bootstrap the node (required)
         
     | 
| 
      
 39 
     | 
    
         
            +
                # @option options [String] :bootstrap_proxy
         
     | 
| 
      
 40 
     | 
    
         
            +
                #   URL to a proxy server to bootstrap through (default: nil)
         
     | 
| 
      
 41 
     | 
    
         
            +
                # @option options [String] :encrypted_data_bag_secret_path
         
     | 
| 
      
 42 
     | 
    
         
            +
                #   filepath on your host machine to your organizations encrypted data bag secret (default: nil)
         
     | 
| 
      
 43 
     | 
    
         
            +
                # @option options [Hash] :hints
         
     | 
| 
      
 44 
     | 
    
         
            +
                #   a hash of Ohai hints to place on the bootstrapped node (default: Hash.new)
         
     | 
| 
      
 45 
     | 
    
         
            +
                # @option options [Hash] :attributes
         
     | 
| 
      
 46 
     | 
    
         
            +
                #   a hash of attributes to use in the first Chef run (default: Hash.new)
         
     | 
| 
      
 47 
     | 
    
         
            +
                # @option options [Array] :run_list
         
     | 
| 
      
 48 
     | 
    
         
            +
                #   an initial run list to bootstrap with (default: Array.new)
         
     | 
| 
      
 49 
     | 
    
         
            +
                # @option options [String] :chef_version
         
     | 
| 
      
 50 
     | 
    
         
            +
                #   version of Chef to install on the node (default: {Ridley::CHEF_VERSION})
         
     | 
| 
      
 51 
     | 
    
         
            +
                # @option options [String] :environment
         
     | 
| 
      
 52 
     | 
    
         
            +
                #   environment to join the node to (default: '_default')
         
     | 
| 
      
 53 
     | 
    
         
            +
                # @option options [Boolean] :sudo
         
     | 
| 
      
 54 
     | 
    
         
            +
                #   bootstrap with sudo (default: true)
         
     | 
| 
      
 55 
     | 
    
         
            +
                # @option options [String] :template
         
     | 
| 
      
 56 
     | 
    
         
            +
                #   bootstrap template to use (default: omnibus)
         
     | 
| 
      
 57 
     | 
    
         
            +
                def initialize(hosts, options = {})
         
     | 
| 
      
 58 
     | 
    
         
            +
                  @hosts      = Array(hosts).collect(&:to_s).uniq
         
     | 
| 
      
 59 
     | 
    
         
            +
                  @ssh_config = {
         
     | 
| 
      
 60 
     | 
    
         
            +
                    user: options.fetch(:ssh_user),
         
     | 
| 
      
 61 
     | 
    
         
            +
                    password: options[:ssh_password],
         
     | 
| 
      
 62 
     | 
    
         
            +
                    keys: options[:ssh_keys],
         
     | 
| 
      
 63 
     | 
    
         
            +
                    timeout: (options[:ssh_timeout] || 1.5)
         
     | 
| 
      
 64 
     | 
    
         
            +
                  }
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                  @contexts = @hosts.collect do |host|
         
     | 
| 
      
 67 
     | 
    
         
            +
                    Context.new(host, options)
         
     | 
| 
      
 68 
     | 
    
         
            +
                  end
         
     | 
| 
      
 69 
     | 
    
         
            +
                end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                # @return [SSH::ResponseSet]
         
     | 
| 
      
 72 
     | 
    
         
            +
                def run
         
     | 
| 
      
 73 
     | 
    
         
            +
                  if contexts.length >= 2
         
     | 
| 
      
 74 
     | 
    
         
            +
                    pool = SSH::Worker.pool(size: contexts.length, args: [self.ssh_config])
         
     | 
| 
      
 75 
     | 
    
         
            +
                  else
         
     | 
| 
      
 76 
     | 
    
         
            +
                    pool = SSH::Worker.new(self.ssh_config)
         
     | 
| 
      
 77 
     | 
    
         
            +
                  end
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
                  responses = contexts.collect do |context|
         
     | 
| 
      
 80 
     | 
    
         
            +
                    pool.future.run(context.host, context.boot_command)
         
     | 
| 
      
 81 
     | 
    
         
            +
                  end.collect(&:value)
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
                  SSH::ResponseSet.new.tap do |response_set|
         
     | 
| 
      
 84 
     | 
    
         
            +
                    responses.each do |message|
         
     | 
| 
      
 85 
     | 
    
         
            +
                      status, response = message
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
                      case status
         
     | 
| 
      
 88 
     | 
    
         
            +
                      when :ok
         
     | 
| 
      
 89 
     | 
    
         
            +
                        response_set.add_ok(response)
         
     | 
| 
      
 90 
     | 
    
         
            +
                      when :error
         
     | 
| 
      
 91 
     | 
    
         
            +
                        response_set.add_error(response)
         
     | 
| 
      
 92 
     | 
    
         
            +
                      end
         
     | 
| 
      
 93 
     | 
    
         
            +
                    end
         
     | 
| 
      
 94 
     | 
    
         
            +
                  end
         
     | 
| 
      
 95 
     | 
    
         
            +
                ensure
         
     | 
| 
      
 96 
     | 
    
         
            +
                  pool.terminate if pool
         
     | 
| 
      
 97 
     | 
    
         
            +
                end
         
     | 
| 
      
 98 
     | 
    
         
            +
              end
         
     | 
| 
      
 99 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,25 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Ridley
         
     | 
| 
      
 2 
     | 
    
         
            +
              # @author Jamie Winsor <jamie@vialstudios.com>
         
     | 
| 
      
 3 
     | 
    
         
            +
              # @api private
         
     | 
| 
      
 4 
     | 
    
         
            +
              class ChainLink
         
     | 
| 
      
 5 
     | 
    
         
            +
                attr_reader :parent
         
     | 
| 
      
 6 
     | 
    
         
            +
                attr_reader :child
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                # @param [Class, Object] parent
         
     | 
| 
      
 9 
     | 
    
         
            +
                #   the parent class or object to send to the child
         
     | 
| 
      
 10 
     | 
    
         
            +
                # @param [Class, Object] child
         
     | 
| 
      
 11 
     | 
    
         
            +
                #   the child class or instance to delegate functions to
         
     | 
| 
      
 12 
     | 
    
         
            +
                def initialize(parent, child)
         
     | 
| 
      
 13 
     | 
    
         
            +
                  @parent = parent
         
     | 
| 
      
 14 
     | 
    
         
            +
                  @child  = child
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                def new(*args)
         
     | 
| 
      
 18 
     | 
    
         
            +
                  child.send(:new, parent, *args)
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                def method_missing(fun, *args, &block)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  child.send(fun, parent, *args, &block)
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
              end
         
     | 
| 
      
 25 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/ridley/connection.rb
    CHANGED
    
    | 
         @@ -25,6 +25,11 @@ module Ridley 
     | 
|
| 
       25 
25 
     | 
    
         
             
                attr_reader :client_name
         
     | 
| 
       26 
26 
     | 
    
         
             
                attr_reader :client_key
         
     | 
| 
       27 
27 
     | 
    
         
             
                attr_reader :organization
         
     | 
| 
      
 28 
     | 
    
         
            +
                attr_reader :ssh
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                attr_reader :validator_client
         
     | 
| 
      
 31 
     | 
    
         
            +
                attr_reader :validator_path
         
     | 
| 
      
 32 
     | 
    
         
            +
                attr_reader :encrypted_data_bag_secret_path
         
     | 
| 
       28 
33 
     | 
    
         | 
| 
       29 
34 
     | 
    
         
             
                attr_accessor :thread_count
         
     | 
| 
       30 
35 
     | 
    
         | 
| 
         @@ -35,6 +40,7 @@ module Ridley 
     | 
|
| 
       35 
40 
     | 
    
         
             
                def_delegator :conn, :path_prefix
         
     | 
| 
       36 
41 
     | 
    
         | 
| 
       37 
42 
     | 
    
         
             
                def_delegator :conn, :url_prefix=
         
     | 
| 
      
 43 
     | 
    
         
            +
                def_delegator :conn, :url_prefix
         
     | 
| 
       38 
44 
     | 
    
         | 
| 
       39 
45 
     | 
    
         
             
                def_delegator :conn, :get
         
     | 
| 
       40 
46 
     | 
    
         
             
                def_delegator :conn, :put
         
     | 
| 
         @@ -48,7 +54,7 @@ module Ridley 
     | 
|
| 
       48 
54 
     | 
    
         
             
                  :server_url,
         
     | 
| 
       49 
55 
     | 
    
         
             
                  :client_name,
         
     | 
| 
       50 
56 
     | 
    
         
             
                  :client_key
         
     | 
| 
       51 
     | 
    
         
            -
                ]
         
     | 
| 
      
 57 
     | 
    
         
            +
                ].freeze
         
     | 
| 
       52 
58 
     | 
    
         | 
| 
       53 
59 
     | 
    
         
             
                DEFAULT_THREAD_COUNT = 8
         
     | 
| 
       54 
60 
     | 
    
         | 
| 
         @@ -62,7 +68,15 @@ module Ridley 
     | 
|
| 
       62 
68 
     | 
    
         
             
                # @option options [String] :organization
         
     | 
| 
       63 
69 
     | 
    
         
             
                #   the Organization to connect to. This is only used if you are connecting to
         
     | 
| 
       64 
70 
     | 
    
         
             
                #   private Chef or hosted Chef
         
     | 
| 
      
 71 
     | 
    
         
            +
                # @option options [String] :validator_client
         
     | 
| 
      
 72 
     | 
    
         
            +
                #   (default: nil)
         
     | 
| 
      
 73 
     | 
    
         
            +
                # @option options [String] :validator_path
         
     | 
| 
      
 74 
     | 
    
         
            +
                #   (default: nil)
         
     | 
| 
      
 75 
     | 
    
         
            +
                # @option options [String] :encrypted_data_bag_secret_path
         
     | 
| 
      
 76 
     | 
    
         
            +
                #   (default: nil)
         
     | 
| 
       65 
77 
     | 
    
         
             
                # @option options [Integer] :thread_count
         
     | 
| 
      
 78 
     | 
    
         
            +
                # @option options [Hash] :ssh
         
     | 
| 
      
 79 
     | 
    
         
            +
                #   authentication credentials for bootstrapping or connecting to nodes (default: Hash.new)
         
     | 
| 
       66 
80 
     | 
    
         
             
                # @option options [Hash] :params
         
     | 
| 
       67 
81 
     | 
    
         
             
                #   URI query unencoded key/value pairs
         
     | 
| 
       68 
82 
     | 
    
         
             
                # @option options [Hash] :headers
         
     | 
| 
         @@ -76,10 +90,14 @@ module Ridley 
     | 
|
| 
       76 
90 
     | 
    
         
             
                def initialize(options = {})
         
     | 
| 
       77 
91 
     | 
    
         
             
                  self.class.validate_options(options)
         
     | 
| 
       78 
92 
     | 
    
         | 
| 
       79 
     | 
    
         
            -
                  @client_name 
     | 
| 
       80 
     | 
    
         
            -
                  @client_key 
     | 
| 
       81 
     | 
    
         
            -
                  @organization 
     | 
| 
       82 
     | 
    
         
            -
                  @thread_count 
     | 
| 
      
 93 
     | 
    
         
            +
                  @client_name      = options.fetch(:client_name)
         
     | 
| 
      
 94 
     | 
    
         
            +
                  @client_key       = options.fetch(:client_key)
         
     | 
| 
      
 95 
     | 
    
         
            +
                  @organization     = options[:organization]
         
     | 
| 
      
 96 
     | 
    
         
            +
                  @thread_count     = (options[:thread_count] || DEFAULT_THREAD_COUNT)
         
     | 
| 
      
 97 
     | 
    
         
            +
                  @ssh              = (options[:ssh] || Hash.new)
         
     | 
| 
      
 98 
     | 
    
         
            +
                  @validator_client = options[:validator_client]
         
     | 
| 
      
 99 
     | 
    
         
            +
                  @validator_path   = options[:validator_path]
         
     | 
| 
      
 100 
     | 
    
         
            +
                  @encrypted_data_bag_secret_path = options[:encrypted_data_bag_secret_path]
         
     | 
| 
       83 
101 
     | 
    
         | 
| 
       84 
102 
     | 
    
         
             
                  unless @client_key.present? && File.exist?(@client_key)
         
     | 
| 
       85 
103 
     | 
    
         
             
                    raise Errors::ClientKeyFileNotFound, "client key not found at: '#{@client_key}'"
         
     | 
| 
         @@ -134,6 +152,10 @@ module Ridley 
     | 
|
| 
       134 
152 
     | 
    
         
             
                  api_type == :foss
         
     | 
| 
       135 
153 
     | 
    
         
             
                end
         
     | 
| 
       136 
154 
     | 
    
         | 
| 
      
 155 
     | 
    
         
            +
                def server_url
         
     | 
| 
      
 156 
     | 
    
         
            +
                  self.url_prefix.to_s
         
     | 
| 
      
 157 
     | 
    
         
            +
                end
         
     | 
| 
      
 158 
     | 
    
         
            +
             
     | 
| 
       137 
159 
     | 
    
         
             
                private
         
     | 
| 
       138 
160 
     | 
    
         | 
| 
       139 
161 
     | 
    
         
             
                  attr_reader :conn
         
     | 
    
        data/lib/ridley/errors.rb
    CHANGED
    
    | 
         @@ -3,6 +3,9 @@ module Ridley 
     | 
|
| 
       3 
3 
     | 
    
         
             
              module Errors
         
     | 
| 
       4 
4 
     | 
    
         
             
                class RidleyError < StandardError; end
         
     | 
| 
       5 
5 
     | 
    
         
             
                class InternalError < RidleyError; end
         
     | 
| 
      
 6 
     | 
    
         
            +
                class ArgumentError < InternalError; end
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                class ValidatorNotFound < RidleyError; end
         
     | 
| 
       6 
9 
     | 
    
         | 
| 
       7 
10 
     | 
    
         
             
                class InvalidResource < RidleyError
         
     | 
| 
       8 
11 
     | 
    
         
             
                  attr_reader :errors
         
     | 
| 
         @@ -17,7 +20,9 @@ module Ridley 
     | 
|
| 
       17 
20 
     | 
    
         
             
                  alias_method :to_s, :message
         
     | 
| 
       18 
21 
     | 
    
         
             
                end
         
     | 
| 
       19 
22 
     | 
    
         | 
| 
       20 
     | 
    
         
            -
                class  
     | 
| 
      
 23 
     | 
    
         
            +
                class BootstrapError < RidleyError; end
         
     | 
| 
      
 24 
     | 
    
         
            +
                class ClientKeyFileNotFound < BootstrapError; end
         
     | 
| 
      
 25 
     | 
    
         
            +
                class EncryptedDataBagSecretNotFound < BootstrapError; end
         
     | 
| 
       21 
26 
     | 
    
         | 
| 
       22 
27 
     | 
    
         
             
                class HTTPError < RidleyError
         
     | 
| 
       23 
28 
     | 
    
         
             
                  class << self
         
     | 
| 
         @@ -0,0 +1,30 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'logger'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Ridley
         
     | 
| 
      
 4 
     | 
    
         
            +
              # @author Jamie Winsor <jamie@vialstudios.com>
         
     | 
| 
      
 5 
     | 
    
         
            +
              module Logging
         
     | 
| 
      
 6 
     | 
    
         
            +
                class << self
         
     | 
| 
      
 7 
     | 
    
         
            +
                  # @return [Logger]
         
     | 
| 
      
 8 
     | 
    
         
            +
                  def logger
         
     | 
| 
      
 9 
     | 
    
         
            +
                    @logger ||= begin
         
     | 
| 
      
 10 
     | 
    
         
            +
                      log = Logger.new(STDOUT)
         
     | 
| 
      
 11 
     | 
    
         
            +
                      log.level = Logger::INFO
         
     | 
| 
      
 12 
     | 
    
         
            +
                      log
         
     | 
| 
      
 13 
     | 
    
         
            +
                    end
         
     | 
| 
      
 14 
     | 
    
         
            +
                  end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                  # @param [Logger, nil] obj
         
     | 
| 
      
 17 
     | 
    
         
            +
                  #
         
     | 
| 
      
 18 
     | 
    
         
            +
                  # @return [Logger]
         
     | 
| 
      
 19 
     | 
    
         
            +
                  def set_logger(obj)
         
     | 
| 
      
 20 
     | 
    
         
            +
                    @logger = (obj.nil? ? Logger.new('/dev/null') : obj)
         
     | 
| 
      
 21 
     | 
    
         
            +
                  end
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                # @return [Logger]
         
     | 
| 
      
 25 
     | 
    
         
            +
                def logger
         
     | 
| 
      
 26 
     | 
    
         
            +
                  Ridley::Logging.logger
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
                alias_method :log, :logger
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -64,12 +64,12 @@ module Ridley 
     | 
|
| 
       64 
64 
     | 
    
         
             
                # Coerces instance functions into class functions on Ridley::Client. This coercion
         
     | 
| 
       65 
65 
     | 
    
         
             
                # sends an instance of the including class along to the class function.
         
     | 
| 
       66 
66 
     | 
    
         
             
                #
         
     | 
| 
       67 
     | 
    
         
            -
                # @see Ridley:: 
     | 
| 
      
 67 
     | 
    
         
            +
                # @see Ridley::ChainLink
         
     | 
| 
       68 
68 
     | 
    
         
             
                #
         
     | 
| 
       69 
     | 
    
         
            -
                # @return [Ridley:: 
     | 
| 
      
 69 
     | 
    
         
            +
                # @return [Ridley::ChainLink]
         
     | 
| 
       70 
70 
     | 
    
         
             
                #   a context object to delegate instance functions to class functions on Ridley::Client
         
     | 
| 
       71 
71 
     | 
    
         
             
                def client
         
     | 
| 
       72 
     | 
    
         
            -
                   
     | 
| 
      
 72 
     | 
    
         
            +
                  ChainLink.new(self, Ridley::Client)
         
     | 
| 
       73 
73 
     | 
    
         
             
                end
         
     | 
| 
       74 
74 
     | 
    
         
             
              end
         
     | 
| 
       75 
75 
     | 
    
         
             
            end
         
     | 
| 
         @@ -42,12 +42,12 @@ module Ridley 
     | 
|
| 
       42 
42 
     | 
    
         
             
                # Coerces instance functions into class functions on Ridley::Cookbook. This coercion
         
     | 
| 
       43 
43 
     | 
    
         
             
                # sends an instance of the including class along to the class function.
         
     | 
| 
       44 
44 
     | 
    
         
             
                #
         
     | 
| 
       45 
     | 
    
         
            -
                # @see Ridley:: 
     | 
| 
      
 45 
     | 
    
         
            +
                # @see Ridley::ChainLink
         
     | 
| 
       46 
46 
     | 
    
         
             
                #
         
     | 
| 
       47 
     | 
    
         
            -
                # @return [Ridley:: 
     | 
| 
      
 47 
     | 
    
         
            +
                # @return [Ridley::ChainLink]
         
     | 
| 
       48 
48 
     | 
    
         
             
                #   a context object to delegate instance functions to class functions on Ridley::Cookbook
         
     | 
| 
       49 
49 
     | 
    
         
             
                def cookbook
         
     | 
| 
       50 
     | 
    
         
            -
                   
     | 
| 
      
 50 
     | 
    
         
            +
                  ChainLink.new(self, Ridley::Cookbook)
         
     | 
| 
       51 
51 
     | 
    
         
             
                end
         
     | 
| 
       52 
52 
     | 
    
         
             
              end
         
     | 
| 
       53 
53 
     | 
    
         
             
            end
         
     |