tiller 0.1.5 → 0.2.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.
- checksums.yaml +4 -4
- data/bin/tiller +39 -8
- data/examples/json/common.yaml +3 -0
- data/lib/tiller/api.rb +69 -0
- data/lib/tiller/api/handlers/404.rb +6 -0
- data/lib/tiller/api/handlers/config.rb +14 -0
- data/lib/tiller/api/handlers/globals.rb +14 -0
- data/lib/tiller/api/handlers/ping.rb +6 -0
- data/lib/tiller/api/handlers/template.rb +19 -0
- data/lib/tiller/api/handlers/templates.rb +14 -0
- data/lib/tiller/data/file.rb +1 -0
- metadata +9 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: f0724940d4aabb1620ddc521faff0783fa9b5b0f
         | 
| 4 | 
            +
              data.tar.gz: 379f0c788be67ed8c8176e964226b2ade39afcfe
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 75d56a1140dd02e6b5ae3ee56a88d639439cc92a1751d129291978ed0f2339ad5899d08cfa6cb39b2064ecbff4265ed6d0a36b988c7fa574306f393498f7dcab
         | 
| 7 | 
            +
              data.tar.gz: f7836c90b6750fbdcfc0d4a50893c0ef74edba09ddc14c1efb7e024b14240b46888d22e5c0624ae51587e1e2fbec96cbe9382fcf46043f8568647dedcaa00f9f
         | 
    
        data/bin/tiller
    CHANGED
    
    | @@ -12,6 +12,9 @@ require 'yaml' | |
| 12 12 | 
             
            require 'fileutils'
         | 
| 13 13 | 
             
            require 'optparse'
         | 
| 14 14 | 
             
            require 'pp'
         | 
| 15 | 
            +
            require 'json'
         | 
| 16 | 
            +
            require 'socket'
         | 
| 17 | 
            +
            require 'tiller/api'
         | 
| 15 18 |  | 
| 16 19 | 
             
            # This is needed so we can enumerate all the loaded plugins later
         | 
| 17 20 | 
             
            class Class
         | 
| @@ -41,6 +44,7 @@ module Tiller | |
| 41 44 | 
             
              # Parse command-line arguments
         | 
| 42 45 | 
             
              config[:no_exec] = false
         | 
| 43 46 | 
             
              config[:verbose] = false
         | 
| 47 | 
            +
              config[:api_enable] = false
         | 
| 44 48 |  | 
| 45 49 | 
             
              optparse = OptionParser.new do |opts|
         | 
| 46 50 | 
             
                opts.on('-n', '--no-exec', 'Do not execute a replacement process') do
         | 
| @@ -49,6 +53,12 @@ module Tiller | |
| 49 53 | 
             
                opts.on('-v', '--verbose', 'Display verbose output') do
         | 
| 50 54 | 
             
                  config[:verbose] = true
         | 
| 51 55 | 
             
                end
         | 
| 56 | 
            +
                opts.on('-a', '--api', 'Enable HTTP API') do
         | 
| 57 | 
            +
                  config['api_enable'] = true
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
                opts.on('-p', '--api-port [API_PORT]', 'HTTP API port') do |api_port|
         | 
| 60 | 
            +
                  config['api_port'] = api_port
         | 
| 61 | 
            +
                end
         | 
| 52 62 | 
             
                opts.on('-b', '--base-dir [BASE_DIR]', 'Override the tiller_base environment variable') do |base_dir|
         | 
| 53 63 | 
             
                  config[:tiller_base] = base_dir
         | 
| 54 64 | 
             
                end
         | 
| @@ -79,7 +89,7 @@ module Tiller | |
| 79 89 | 
             
              require 'tiller/datasource.rb'
         | 
| 80 90 |  | 
| 81 91 | 
             
              # Load the common YAML configuration file
         | 
| 82 | 
            -
              config | 
| 92 | 
            +
              config.merge!(YAML.load(open(File.join(config[:tiller_base], 'common.yaml'))))
         | 
| 83 93 |  | 
| 84 94 | 
             
              puts "tiller v#{VERSION} (https://github.com/markround/tiller) <github@markround.com>"
         | 
| 85 95 |  | 
| @@ -92,8 +102,8 @@ module Tiller | |
| 92 102 | 
             
              # Now load all our plugins
         | 
| 93 103 | 
             
              template_sources = Array.new
         | 
| 94 104 | 
             
              data_sources = Array.new
         | 
| 95 | 
            -
              template_sources |= config[ | 
| 96 | 
            -
              data_sources |= config[ | 
| 105 | 
            +
              template_sources |= config['template_sources']
         | 
| 106 | 
            +
              data_sources |= config['data_sources']
         | 
| 97 107 | 
             
              template_sources.each { |t| require "tiller/template/#{t}.rb" }
         | 
| 98 108 | 
             
              data_sources.each { |t| require "tiller/data/#{t}.rb" }
         | 
| 99 109 |  | 
| @@ -127,6 +137,7 @@ module Tiller | |
| 127 137 |  | 
| 128 138 | 
             
              # Now we go through each template we've identified, and get the
         | 
| 129 139 | 
             
              # values for each one.
         | 
| 140 | 
            +
              all_templates = Hash.new
         | 
| 130 141 | 
             
              templates.each do |template, content|
         | 
| 131 142 | 
             
                values = Hash.new
         | 
| 132 143 | 
             
                target_values = Hash.new
         | 
| @@ -170,6 +181,12 @@ module Tiller | |
| 170 181 | 
             
                target.puts(parsed_template)
         | 
| 171 182 | 
             
                target.close
         | 
| 172 183 |  | 
| 184 | 
            +
                # config is redundant in target_values, remove it for the final status hash.
         | 
| 185 | 
            +
                all_templates[template]={
         | 
| 186 | 
            +
                    'merged_values' => tiller,
         | 
| 187 | 
            +
                    'target_values' => target_values.reject{|k,v| k=='config'}
         | 
| 188 | 
            +
                }
         | 
| 189 | 
            +
             | 
| 173 190 | 
             
                # Set permissions if we are running as root
         | 
| 174 191 | 
             
                if Process::Sys.geteuid == 0
         | 
| 175 192 | 
             
                  puts "Setting ownership/permissions on #{target_values['target']}" if config[:verbose]
         | 
| @@ -189,11 +206,25 @@ module Tiller | |
| 189 206 |  | 
| 190 207 | 
             
              puts 'Template generation completed'
         | 
| 191 208 |  | 
| 192 | 
            -
               | 
| 193 | 
            -
             | 
| 194 | 
            -
             | 
| 195 | 
            -
             | 
| 196 | 
            -
                 | 
| 209 | 
            +
              # Final status structure for API
         | 
| 210 | 
            +
              tiller_api_hash={'config' => config, 'global_values' => global_values, 'templates' => all_templates}
         | 
| 211 | 
            +
             | 
| 212 | 
            +
              if config['api_enable']
         | 
| 213 | 
            +
                Thread.start{ tiller_api(tiller_api_hash) }
         | 
| 214 | 
            +
              end
         | 
| 215 | 
            +
             | 
| 216 | 
            +
              if config[:no_exec] == false && config.key?('exec')
         | 
| 217 | 
            +
                # All templates created, so let's start the replacement process
         | 
| 218 | 
            +
                puts "Executing #{config['exec']}..."
         | 
| 219 | 
            +
             | 
| 220 | 
            +
                # Fork and wait so API can continue to run
         | 
| 221 | 
            +
                fork do
         | 
| 222 | 
            +
                  system(config['exec'])
         | 
| 223 | 
            +
                end
         | 
| 224 | 
            +
             | 
| 225 | 
            +
                puts "Child process forked." if config[:verbose]
         | 
| 226 | 
            +
                Process.wait
         | 
| 227 | 
            +
                puts "Child process finished, Tiller is stopping." if config[:verbose]
         | 
| 197 228 | 
             
              end
         | 
| 198 229 |  | 
| 199 230 |  | 
    
        data/examples/json/common.yaml
    CHANGED
    
    
    
        data/lib/tiller/api.rb
    ADDED
    
    | @@ -0,0 +1,69 @@ | |
| 1 | 
            +
            require 'json'
         | 
| 2 | 
            +
            require 'socket'
         | 
| 3 | 
            +
            require 'tiller/api/handlers/404'
         | 
| 4 | 
            +
            require 'tiller/api/handlers/ping'
         | 
| 5 | 
            +
            require 'tiller/api/handlers/config'
         | 
| 6 | 
            +
            require 'tiller/api/handlers/globals'
         | 
| 7 | 
            +
            require 'tiller/api/handlers/templates'
         | 
| 8 | 
            +
            require 'tiller/api/handlers/template'
         | 
| 9 | 
            +
             | 
| 10 | 
            +
             | 
| 11 | 
            +
            API_VERSION=1
         | 
| 12 | 
            +
            API_PORT=6275
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            # The following is a VERY simple HTTP API, used for querying the status of Tiller
         | 
| 15 | 
            +
            # after it has generated templates and forked a child process.
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            def tiller_api(tiller_api_hash)
         | 
| 18 | 
            +
              api_port = tiller_api_hash['config']['api_port'] ?
         | 
| 19 | 
            +
                  tiller_api_hash['config']['api_port'] : API_PORT
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              puts "Tiller API starting on port #{api_port}" if tiller_api_hash['config'][:verbose]
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              server = TCPServer.new('127.0.0.1', api_port)
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              loop do
         | 
| 26 | 
            +
                socket = server.accept
         | 
| 27 | 
            +
                request = socket.gets
         | 
| 28 | 
            +
                (method, uri, http_version) = request.split
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                if uri =~ /^\/v([0-9]+)\//
         | 
| 31 | 
            +
                  api_version = uri.split('/')[1]
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                # Defaults
         | 
| 35 | 
            +
                response = handle_404
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                # Routing
         | 
| 38 | 
            +
                case method
         | 
| 39 | 
            +
                  when 'GET'
         | 
| 40 | 
            +
                    case uri
         | 
| 41 | 
            +
                      when '/ping'
         | 
| 42 | 
            +
                        response = handle_ping
         | 
| 43 | 
            +
                      when /^\/v([0-9]+)\/config/
         | 
| 44 | 
            +
                        response = handle_config(api_version, tiller_api_hash)
         | 
| 45 | 
            +
                      when /^\/v([0-9]+)\/globals/
         | 
| 46 | 
            +
                        response = handle_globals(api_version, tiller_api_hash)
         | 
| 47 | 
            +
                      when /^\/v([0-9]+)\/templates/
         | 
| 48 | 
            +
                        response = handle_templates(api_version, tiller_api_hash)
         | 
| 49 | 
            +
                      when /^\/v([0-9]+)\/template\//
         | 
| 50 | 
            +
                        template = uri.split('/')[3]
         | 
| 51 | 
            +
                        response = handle_template(api_version, tiller_api_hash, template)
         | 
| 52 | 
            +
                    end
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                # Response
         | 
| 56 | 
            +
                socket.print "HTTP/1.1 #{response[:status]}\r\n" +
         | 
| 57 | 
            +
                                 "Content-Type: application/json\r\n" +
         | 
| 58 | 
            +
                                 "Server: Tiller #{VERSION} / API v#{API_VERSION}\r\n"
         | 
| 59 | 
            +
                                 "Content-Length: #{response[:content].bytesize}\r\n" +
         | 
| 60 | 
            +
                                 "Connection: close\r\n"
         | 
| 61 | 
            +
                socket.print "\r\n"
         | 
| 62 | 
            +
                socket.print response[:content]
         | 
| 63 | 
            +
                socket.close
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
            end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
             | 
| 68 | 
            +
             | 
| 69 | 
            +
             | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            require 'json'
         | 
| 2 | 
            +
            require 'tiller/api/handlers/404'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            def handle_globals(api_version, tiller_api_hash)
         | 
| 5 | 
            +
              case api_version
         | 
| 6 | 
            +
                when 'v1'
         | 
| 7 | 
            +
                  {
         | 
| 8 | 
            +
                      :content => tiller_api_hash['global_values'].to_json,
         | 
| 9 | 
            +
                      :status => '200 OK'
         | 
| 10 | 
            +
                  }
         | 
| 11 | 
            +
                else
         | 
| 12 | 
            +
                  handle_404
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
            end
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            require 'json'
         | 
| 2 | 
            +
            require 'tiller/api/handlers/404'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            def handle_template(api_version, tiller_api_hash, template)
         | 
| 5 | 
            +
              case api_version
         | 
| 6 | 
            +
                when 'v1'
         | 
| 7 | 
            +
                  if tiller_api_hash['templates'].has_key?(template)
         | 
| 8 | 
            +
                    {
         | 
| 9 | 
            +
                        :content => tiller_api_hash['templates'][template].to_json,
         | 
| 10 | 
            +
                        :status => '200 OK'
         | 
| 11 | 
            +
                    }
         | 
| 12 | 
            +
                  else
         | 
| 13 | 
            +
                    {
         | 
| 14 | 
            +
                        :content => '{ "error" : "template not found" }',
         | 
| 15 | 
            +
                        :status => '404 Not Found'
         | 
| 16 | 
            +
                    }
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
            end
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            require 'json'
         | 
| 2 | 
            +
            require 'tiller/api/handlers/404'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            def handle_templates(api_version, tiller_api_hash)
         | 
| 5 | 
            +
              case api_version
         | 
| 6 | 
            +
                when 'v1'
         | 
| 7 | 
            +
                    {
         | 
| 8 | 
            +
                        :content => tiller_api_hash['templates'].keys.to_json,
         | 
| 9 | 
            +
                        :status => '200 OK'
         | 
| 10 | 
            +
                    }
         | 
| 11 | 
            +
                  else
         | 
| 12 | 
            +
                    handle_404
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
              end
         | 
    
        data/lib/tiller/data/file.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: tiller
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.2.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Mark Round
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2014-10- | 
| 11 | 
            +
            date: 2014-10-20 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies: []
         | 
| 13 13 | 
             
            description: A tool to create configuration files in Docker containers from a variety
         | 
| 14 14 | 
             
              of sources. See https://github.com/markround/tiller for examples and documentation.
         | 
| @@ -31,6 +31,13 @@ files: | |
| 31 31 | 
             
            - examples/plugins/lib/tiller/data/dummy.rb
         | 
| 32 32 | 
             
            - examples/plugins/lib/tiller/data/network.rb
         | 
| 33 33 | 
             
            - examples/plugins/lib/tiller/template/dummy.rb
         | 
| 34 | 
            +
            - lib/tiller/api.rb
         | 
| 35 | 
            +
            - lib/tiller/api/handlers/404.rb
         | 
| 36 | 
            +
            - lib/tiller/api/handlers/config.rb
         | 
| 37 | 
            +
            - lib/tiller/api/handlers/globals.rb
         | 
| 38 | 
            +
            - lib/tiller/api/handlers/ping.rb
         | 
| 39 | 
            +
            - lib/tiller/api/handlers/template.rb
         | 
| 40 | 
            +
            - lib/tiller/api/handlers/templates.rb
         | 
| 34 41 | 
             
            - lib/tiller/data/environment.rb
         | 
| 35 42 | 
             
            - lib/tiller/data/environment_json.rb
         | 
| 36 43 | 
             
            - lib/tiller/data/file.rb
         |