linecook-gem 0.0.3 → 0.0.4
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/lib/linecook/builder/build.rb +28 -0
- data/lib/linecook/{darwin_backend.rb → builder/darwin_backend.rb} +4 -1
- data/lib/linecook/{linux_backend.rb → builder/linux_backend.rb} +3 -3
- data/lib/linecook/{lxc.rb → builder/lxc.rb} +25 -43
- data/lib/linecook/builder/manager.rb +56 -0
- data/lib/linecook/cli.rb +77 -12
- data/lib/linecook/image/crypt.rb +49 -0
- data/lib/linecook/image/github.rb +27 -0
- data/lib/linecook/image/manager.rb +43 -0
- data/lib/linecook/image/s3.rb +47 -0
- data/lib/linecook/packager/ebs.rb +270 -0
- data/lib/linecook/packager/manager.rb +23 -0
- data/lib/linecook/{chef.rb → provisioner/chef-zero.rb} +3 -2
- data/lib/linecook/provisioner/manager.rb +34 -0
- data/lib/linecook/provisioner/packer.rb +82 -0
- data/lib/linecook/{config.rb → util/config.rb} +44 -4
- data/lib/linecook/util/downloader.rb +35 -0
- data/lib/linecook/util/executor.rb +33 -0
- data/lib/linecook/{ssh.rb → util/ssh.rb} +59 -2
- data/lib/linecook/version.rb +1 -1
- data/lib/linecook.rb +5 -4
- metadata +76 -11
- data/lib/linecook/bake.rb +0 -21
- data/lib/linecook/build.rb +0 -21
- data/lib/linecook/builder.rb +0 -93
- data/lib/linecook/image.rb +0 -51
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: linecook-gem
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.4
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Dale Hamel
         | 
| @@ -136,6 +136,62 @@ dependencies: | |
| 136 136 | 
             
                - - '='
         | 
| 137 137 | 
             
                  - !ruby/object:Gem::Version
         | 
| 138 138 | 
             
                    version: 0.8.0
         | 
| 139 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 140 | 
            +
              name: encryptor
         | 
| 141 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 142 | 
            +
                requirements:
         | 
| 143 | 
            +
                - - '='
         | 
| 144 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 145 | 
            +
                    version: 1.3.0
         | 
| 146 | 
            +
              type: :runtime
         | 
| 147 | 
            +
              prerelease: false
         | 
| 148 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 149 | 
            +
                requirements:
         | 
| 150 | 
            +
                - - '='
         | 
| 151 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 152 | 
            +
                    version: 1.3.0
         | 
| 153 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 154 | 
            +
              name: ejson
         | 
| 155 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 156 | 
            +
                requirements:
         | 
| 157 | 
            +
                - - '='
         | 
| 158 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 159 | 
            +
                    version: 1.0.1
         | 
| 160 | 
            +
              type: :runtime
         | 
| 161 | 
            +
              prerelease: false
         | 
| 162 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 163 | 
            +
                requirements:
         | 
| 164 | 
            +
                - - '='
         | 
| 165 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 166 | 
            +
                    version: 1.0.1
         | 
| 167 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 168 | 
            +
              name: aws-sdk
         | 
| 169 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 170 | 
            +
                requirements:
         | 
| 171 | 
            +
                - - '='
         | 
| 172 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 173 | 
            +
                    version: 2.2.4
         | 
| 174 | 
            +
              type: :runtime
         | 
| 175 | 
            +
              prerelease: false
         | 
| 176 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 177 | 
            +
                requirements:
         | 
| 178 | 
            +
                - - '='
         | 
| 179 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 180 | 
            +
                    version: 2.2.4
         | 
| 181 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 182 | 
            +
              name: rubyzip
         | 
| 183 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 184 | 
            +
                requirements:
         | 
| 185 | 
            +
                - - '='
         | 
| 186 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 187 | 
            +
                    version: 1.1.7
         | 
| 188 | 
            +
              type: :runtime
         | 
| 189 | 
            +
              prerelease: false
         | 
| 190 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 191 | 
            +
                requirements:
         | 
| 192 | 
            +
                - - '='
         | 
| 193 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 194 | 
            +
                    version: 1.1.7
         | 
| 139 195 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 140 196 | 
             
              name: rake
         | 
| 141 197 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -202,17 +258,25 @@ extra_rdoc_files: [] | |
| 202 258 | 
             
            files:
         | 
| 203 259 | 
             
            - bin/linecook
         | 
| 204 260 | 
             
            - lib/linecook.rb
         | 
| 205 | 
            -
            - lib/linecook/ | 
| 206 | 
            -
            - lib/linecook/ | 
| 207 | 
            -
            - lib/linecook/builder.rb
         | 
| 208 | 
            -
            - lib/linecook/ | 
| 261 | 
            +
            - lib/linecook/builder/build.rb
         | 
| 262 | 
            +
            - lib/linecook/builder/darwin_backend.rb
         | 
| 263 | 
            +
            - lib/linecook/builder/linux_backend.rb
         | 
| 264 | 
            +
            - lib/linecook/builder/lxc.rb
         | 
| 265 | 
            +
            - lib/linecook/builder/manager.rb
         | 
| 209 266 | 
             
            - lib/linecook/cli.rb
         | 
| 210 | 
            -
            - lib/linecook/ | 
| 211 | 
            -
            - lib/linecook/ | 
| 212 | 
            -
            - lib/linecook/image.rb
         | 
| 213 | 
            -
            - lib/linecook/ | 
| 214 | 
            -
            - lib/linecook/ | 
| 215 | 
            -
            - lib/linecook/ | 
| 267 | 
            +
            - lib/linecook/image/crypt.rb
         | 
| 268 | 
            +
            - lib/linecook/image/github.rb
         | 
| 269 | 
            +
            - lib/linecook/image/manager.rb
         | 
| 270 | 
            +
            - lib/linecook/image/s3.rb
         | 
| 271 | 
            +
            - lib/linecook/packager/ebs.rb
         | 
| 272 | 
            +
            - lib/linecook/packager/manager.rb
         | 
| 273 | 
            +
            - lib/linecook/provisioner/chef-zero.rb
         | 
| 274 | 
            +
            - lib/linecook/provisioner/manager.rb
         | 
| 275 | 
            +
            - lib/linecook/provisioner/packer.rb
         | 
| 276 | 
            +
            - lib/linecook/util/config.rb
         | 
| 277 | 
            +
            - lib/linecook/util/downloader.rb
         | 
| 278 | 
            +
            - lib/linecook/util/executor.rb
         | 
| 279 | 
            +
            - lib/linecook/util/ssh.rb
         | 
| 216 280 | 
             
            - lib/linecook/version.rb
         | 
| 217 281 | 
             
            - man/LINECOOK.1
         | 
| 218 282 | 
             
            homepage: http://rubygems.org/gems/linecook
         | 
| @@ -240,3 +304,4 @@ signing_key: | |
| 240 304 | 
             
            specification_version: 4
         | 
| 241 305 | 
             
            summary: Build system images using chef zero, LXC, and packer
         | 
| 242 306 | 
             
            test_files: []
         | 
| 307 | 
            +
            has_rdoc: 
         | 
    
        data/lib/linecook/bake.rb
    DELETED
    
    | @@ -1,21 +0,0 @@ | |
| 1 | 
            -
            require 'securerandom'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'linecook/build'
         | 
| 4 | 
            -
            require 'linecook/chef'
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            module Linecook
         | 
| 7 | 
            -
              module Baker
         | 
| 8 | 
            -
                extend self
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                def bake
         | 
| 11 | 
            -
                  provisioner = 'chef' # FIXME HACK - read from config instead
         | 
| 12 | 
            -
                  build = Linecook::Build.new('test', 'ubuntu-base.squashfs') # FIXME - HACK, read from config
         | 
| 13 | 
            -
                  case provisioner
         | 
| 14 | 
            -
                    when 'chef'
         | 
| 15 | 
            -
                      Linecook::Chef.provision(build)
         | 
| 16 | 
            -
                    else
         | 
| 17 | 
            -
                      fail "Unsupported provisioner #{provisioner}"
         | 
| 18 | 
            -
                  end
         | 
| 19 | 
            -
                end
         | 
| 20 | 
            -
              end
         | 
| 21 | 
            -
            end
         | 
    
        data/lib/linecook/build.rb
    DELETED
    
    | @@ -1,21 +0,0 @@ | |
| 1 | 
            -
            require 'forwardable'
         | 
| 2 | 
            -
            require 'linecook/builder'
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            module Linecook
         | 
| 5 | 
            -
              class Build
         | 
| 6 | 
            -
                extend Forwardable
         | 
| 7 | 
            -
             | 
| 8 | 
            -
                def_instance_delegators :@container, :stop, :start, :ip, :info
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                def initialize(name, image)
         | 
| 11 | 
            -
                  Linecook::Builder.start
         | 
| 12 | 
            -
                  @name = name
         | 
| 13 | 
            -
                  @image = image
         | 
| 14 | 
            -
                  @container = Linecook::Lxc::Container.new(name: @name, image: @image, remote: Linecook::Builder.ssh)
         | 
| 15 | 
            -
                end
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                def ssh
         | 
| 18 | 
            -
                  @ssh ||= Linecook::SSH.new(@container.ip, username: 'ubuntu', password: 'ubuntu', proxy: Linecook::Builder.ssh, keyfile: Linecook::Builder.pemfile)
         | 
| 19 | 
            -
                end
         | 
| 20 | 
            -
              end
         | 
| 21 | 
            -
            end
         | 
    
        data/lib/linecook/builder.rb
    DELETED
    
    | @@ -1,93 +0,0 @@ | |
| 1 | 
            -
            require 'forwardable'
         | 
| 2 | 
            -
            require 'sshkey'
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            require 'linecook/lxc'
         | 
| 5 | 
            -
            require 'linecook/darwin_backend'
         | 
| 6 | 
            -
            require 'linecook/linux_backend'
         | 
| 7 | 
            -
            #
         | 
| 8 | 
            -
            # Linux builder:
         | 
| 9 | 
            -
            #  - just checks for a bridge interface
         | 
| 10 | 
            -
            #  - download live image, if not already
         | 
| 11 | 
            -
            #  - sets up lxc container using local lxc config
         | 
| 12 | 
            -
            #  - copies base image into builder container
         | 
| 13 | 
            -
             | 
| 14 | 
            -
            # OS X builder:
         | 
| 15 | 
            -
            #  - download live ISO
         | 
| 16 | 
            -
            #   - hdiutil
         | 
| 17 | 
            -
            #  - create cache loopback image
         | 
| 18 | 
            -
            #   - dd, based on config file.
         | 
| 19 | 
            -
            #  - start xhyve using gem
         | 
| 20 | 
            -
            #   - keep track of PID and IP
         | 
| 21 | 
            -
            #  - copy base image into xhyve cache
         | 
| 22 | 
            -
             | 
| 23 | 
            -
            # One linecook instance per build, but many linecook instances can share a single builder
         | 
| 24 | 
            -
            # FIXME: How to deal with concurrent builds on different branches / revisions?
         | 
| 25 | 
            -
             | 
| 26 | 
            -
            module Linecook
         | 
| 27 | 
            -
              module Builder
         | 
| 28 | 
            -
                extend self
         | 
| 29 | 
            -
                extend Forwardable
         | 
| 30 | 
            -
                BUILD_HOME = '/u/lxc'
         | 
| 31 | 
            -
             | 
| 32 | 
            -
                attr_reader :pemfile
         | 
| 33 | 
            -
                def_instance_delegators :backend, :stop, :ip, :info, :running?
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                def backend
         | 
| 36 | 
            -
                  @backend ||= backend_for_platform
         | 
| 37 | 
            -
                end
         | 
| 38 | 
            -
             | 
| 39 | 
            -
                def start
         | 
| 40 | 
            -
                  return if running?
         | 
| 41 | 
            -
                  backend.start
         | 
| 42 | 
            -
                  setup_ssh
         | 
| 43 | 
            -
                end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
                def ssh
         | 
| 46 | 
            -
                  config = Linecook::Config.load_config[:builder]
         | 
| 47 | 
            -
                  @ssh ||= begin
         | 
| 48 | 
            -
                    userkey = File.expand_path("~/.ssh/id_rsa")
         | 
| 49 | 
            -
                    dedicated_key = File.join(Linecook::Config::LINECOOK_HOME, 'linecook_ssh.pem')
         | 
| 50 | 
            -
                    unless File.exists?(dedicated_key)
         | 
| 51 | 
            -
                      File.write(dedicated_key, SSHKey.generate.private_key)
         | 
| 52 | 
            -
                      FileUtils.chmod(0600, dedicated_key)
         | 
| 53 | 
            -
                    end
         | 
| 54 | 
            -
                    @pemfile = File.exists?(userkey) ? userkey : dedicated_key
         | 
| 55 | 
            -
                    puts @pemfile
         | 
| 56 | 
            -
                    SSH.new(ip, username: config[:username], password: config[:password], keyfile: @pemfile)
         | 
| 57 | 
            -
                  end
         | 
| 58 | 
            -
                end
         | 
| 59 | 
            -
             | 
| 60 | 
            -
                def builds
         | 
| 61 | 
            -
                  ssh.test("[ -d #{BUILD_HOME} ]") ? ssh.capture("find  #{BUILD_HOME} -maxdepth 1 -mindepth 1 -type d -printf \"%f\n\"").delete(';').lines : []
         | 
| 62 | 
            -
                end
         | 
| 63 | 
            -
             | 
| 64 | 
            -
                def build_info
         | 
| 65 | 
            -
                  info = {}
         | 
| 66 | 
            -
                  builds.each do |build|
         | 
| 67 | 
            -
                    info[build] = Linecook::Build.new(build, nil).info
         | 
| 68 | 
            -
                  end
         | 
| 69 | 
            -
                  info
         | 
| 70 | 
            -
                end
         | 
| 71 | 
            -
             | 
| 72 | 
            -
                private
         | 
| 73 | 
            -
             | 
| 74 | 
            -
                def setup_ssh
         | 
| 75 | 
            -
                  ssh
         | 
| 76 | 
            -
                  pubkey = SSHKey.new(File.read(@pemfile)).ssh_public_key
         | 
| 77 | 
            -
                  config = Linecook::Config.load_config[:builder]
         | 
| 78 | 
            -
                  ssh.run("mkdir -p /home/#{config[:username]}/.ssh")
         | 
| 79 | 
            -
                  ssh.upload(pubkey, "/home/#{config[:username]}/.ssh/authorized_keys")
         | 
| 80 | 
            -
                end
         | 
| 81 | 
            -
             | 
| 82 | 
            -
                def backend_for_platform
         | 
| 83 | 
            -
                  case Config.platform
         | 
| 84 | 
            -
                  when 'linux'
         | 
| 85 | 
            -
                    LinuxBuilder.backend
         | 
| 86 | 
            -
                  when 'darwin'
         | 
| 87 | 
            -
                    OSXBuilder.backend
         | 
| 88 | 
            -
                  else
         | 
| 89 | 
            -
                    fail "Cannot find supported backend for #{Config.platform}"
         | 
| 90 | 
            -
                  end
         | 
| 91 | 
            -
                end
         | 
| 92 | 
            -
              end
         | 
| 93 | 
            -
            end
         | 
    
        data/lib/linecook/image.rb
    DELETED
    
    | @@ -1,51 +0,0 @@ | |
| 1 | 
            -
            require 'open-uri'
         | 
| 2 | 
            -
            require 'fileutils'
         | 
| 3 | 
            -
            require 'digest'
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            require 'octokit'
         | 
| 6 | 
            -
            require 'ruby-progressbar'
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            module Linecook
         | 
| 9 | 
            -
              module ImageFetcher
         | 
| 10 | 
            -
                extend self
         | 
| 11 | 
            -
             | 
| 12 | 
            -
                def fetch(name, upgrade:false)
         | 
| 13 | 
            -
                  dir = File.join(Config::LINECOOK_HOME, 'images')
         | 
| 14 | 
            -
                  path = File.join(dir, name)
         | 
| 15 | 
            -
                  download(image(name)[:browser_download_url], path) unless File.exist?(path) || upgrade
         | 
| 16 | 
            -
                  path
         | 
| 17 | 
            -
                end
         | 
| 18 | 
            -
             | 
| 19 | 
            -
                private
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                def client
         | 
| 22 | 
            -
                  @client ||= Octokit::Client.new
         | 
| 23 | 
            -
                end
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                def source
         | 
| 26 | 
            -
                  @source ||= (Config.load_config['source_repo'] || 'dalehamel/lxb')
         | 
| 27 | 
            -
                end
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                def latest
         | 
| 30 | 
            -
                  client.releases(source).sort_by { |r| r[:published_at] }.last
         | 
| 31 | 
            -
                end
         | 
| 32 | 
            -
             | 
| 33 | 
            -
                def image(name)
         | 
| 34 | 
            -
                  latest[:assets].find { |a| a[:name] =~ /#{name}/ }
         | 
| 35 | 
            -
                end
         | 
| 36 | 
            -
             | 
| 37 | 
            -
                def download(url, path)
         | 
| 38 | 
            -
                  FileUtils.mkdir_p(File.dirname(path))
         | 
| 39 | 
            -
                  File.open(path, 'w') do |f|
         | 
| 40 | 
            -
                    pbar = ProgressBar.create(title: File.basename(path), total: nil)
         | 
| 41 | 
            -
                    IO.copy_stream(open(url,
         | 
| 42 | 
            -
                                        content_length_proc: lambda do|t|
         | 
| 43 | 
            -
                                          pbar.total = t if t && 0 < t
         | 
| 44 | 
            -
                                        end,
         | 
| 45 | 
            -
                                        progress_proc: lambda do|s|
         | 
| 46 | 
            -
                                          pbar.progress = s
         | 
| 47 | 
            -
                                        end), f)
         | 
| 48 | 
            -
                  end
         | 
| 49 | 
            -
                end
         | 
| 50 | 
            -
              end
         | 
| 51 | 
            -
            end
         |