cookbook-omnifetch 0.5.1 → 0.6.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/.travis.yml +3 -3
- data/cookbook-omnifetch.gemspec +1 -1
- data/lib/cookbook-omnifetch.rb +1 -0
- data/lib/cookbook-omnifetch/artifactory.rb +127 -0
- data/lib/cookbook-omnifetch/version.rb +1 -1
- data/spec/unit/artifactory_spec.rb +64 -0
- data/spec/unit/chef_server_spec.rb +1 -1
- metadata +10 -7
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 3c87b779ed374b94c79ed6d60c92d4acdacca050
         | 
| 4 | 
            +
              data.tar.gz: c5f55d263dd9c5ccc81b96be560664d6d4ac882a
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 948bbab575f6693876e197978b3866b9489dc24c64b3860b94fee60cb5187d96fc3101559067aa163d0b44911aa90c10bc20f1a33de6d14e626cd41198337519
         | 
| 7 | 
            +
              data.tar.gz: 1ad1cac27d2b6a6c84f01c8155a7dcf11f14f5af56c45dd842c50e6e86ff35369e501f81a9914646c07bfa60e9c47cb463506ce5d1b4ef5c23bc885bde277d5c
         | 
    
        data/.travis.yml
    CHANGED
    
    
    
        data/cookbook-omnifetch.gemspec
    CHANGED
    
    
    
        data/lib/cookbook-omnifetch.rb
    CHANGED
    
    | @@ -6,6 +6,7 @@ require "cookbook-omnifetch/git" | |
| 6 6 | 
             
            require "cookbook-omnifetch/github"
         | 
| 7 7 | 
             
            require "cookbook-omnifetch/path"
         | 
| 8 8 | 
             
            require "cookbook-omnifetch/artifactserver"
         | 
| 9 | 
            +
            require "cookbook-omnifetch/artifactory"
         | 
| 9 10 | 
             
            require "cookbook-omnifetch/chef_server"
         | 
| 10 11 |  | 
| 11 12 | 
             
            module CookbookOmnifetch
         | 
| @@ -0,0 +1,127 @@ | |
| 1 | 
            +
            require "cookbook-omnifetch/base"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "mixlib/archive"
         | 
| 4 | 
            +
            require "tmpdir"
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module CookbookOmnifetch
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              class ArtifactoryLocation < BaseLocation
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                attr_reader :uri
         | 
| 11 | 
            +
                attr_reader :cookbook_version
         | 
| 12 | 
            +
                attr_reader :http_client
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                def initialize(dependency, options = {})
         | 
| 15 | 
            +
                  super
         | 
| 16 | 
            +
                  @uri ||= options[:artifactory]
         | 
| 17 | 
            +
                  @cookbook_version = options[:version]
         | 
| 18 | 
            +
                  @http_client = options[:http_client]
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                def repo_host
         | 
| 22 | 
            +
                  @host ||= URI.parse(uri).host
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                def cookbook_name
         | 
| 26 | 
            +
                  dependency.name
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                # Determine if this revision is installed.
         | 
| 30 | 
            +
                #
         | 
| 31 | 
            +
                # @return [Boolean]
         | 
| 32 | 
            +
                def installed?
         | 
| 33 | 
            +
                  install_path.exist?
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                # Install the given cookbook. Subclasses that implement this method should
         | 
| 37 | 
            +
                # perform all the installation and validation steps required.
         | 
| 38 | 
            +
                #
         | 
| 39 | 
            +
                # @return [void]
         | 
| 40 | 
            +
                def install
         | 
| 41 | 
            +
                  FileUtils.mkdir_p(cache_root) unless cache_root.exist?
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  http_client.streaming_request(nil) do |tempfile|
         | 
| 44 | 
            +
                    tempfile.close
         | 
| 45 | 
            +
                    FileUtils.mv(tempfile.path, cache_path)
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  FileUtils.mkdir_p(staging_root) unless staging_root.exist?
         | 
| 49 | 
            +
                  Dir.mktmpdir(nil, staging_root) do |staging_dir|
         | 
| 50 | 
            +
                    Mixlib::Archive.new(cache_path).extract(staging_dir, perms: false)
         | 
| 51 | 
            +
                    staged_cookbook_path = File.join(staging_dir, cookbook_name)
         | 
| 52 | 
            +
                    validate_cached!(staged_cookbook_path)
         | 
| 53 | 
            +
                    FileUtils.mv(staged_cookbook_path, install_path)
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                def sanitized_version
         | 
| 58 | 
            +
                  cookbook_version
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                # The path where this cookbook would live in the store, if it were
         | 
| 62 | 
            +
                # installed.
         | 
| 63 | 
            +
                #
         | 
| 64 | 
            +
                # @return [Pathname, nil]
         | 
| 65 | 
            +
                def install_path
         | 
| 66 | 
            +
                  @install_path ||= CookbookOmnifetch.storage_path.join(cache_key)
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                def cache_key
         | 
| 70 | 
            +
                  "#{dependency.name}-#{cookbook_version}-#{repo_host}"
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                # The cached cookbook for this location.
         | 
| 74 | 
            +
                #
         | 
| 75 | 
            +
                # @return [CachedCookbook]
         | 
| 76 | 
            +
                def cached_cookbook
         | 
| 77 | 
            +
                  raise AbstractFunction,
         | 
| 78 | 
            +
                    "#cached_cookbook must be implemented on #{self.class.name}!"
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                def lock_data
         | 
| 82 | 
            +
                  out = {}
         | 
| 83 | 
            +
                  out["artifactory"] = uri
         | 
| 84 | 
            +
                  out["version"] = cookbook_version
         | 
| 85 | 
            +
                  out
         | 
| 86 | 
            +
                end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                # The lockfile representation of this location.
         | 
| 89 | 
            +
                #
         | 
| 90 | 
            +
                # @return [string]
         | 
| 91 | 
            +
                def to_lock
         | 
| 92 | 
            +
                  raise AbstractFunction,
         | 
| 93 | 
            +
                    "#to_lock must be implemented on #{self.class.name}!"
         | 
| 94 | 
            +
                end
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                # The path where all pristine tarballs from an artifactserver are held.
         | 
| 97 | 
            +
                # Tarballs are moved/swapped into this location once they have been staged
         | 
| 98 | 
            +
                # in a co-located staging directory.
         | 
| 99 | 
            +
                #
         | 
| 100 | 
            +
                # @return [Pathname]
         | 
| 101 | 
            +
                def cache_root
         | 
| 102 | 
            +
                  Pathname.new(CookbookOmnifetch.cache_path).join(".cache", "artifactserver")
         | 
| 103 | 
            +
                end
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                # The path where tarballs are downloaded to and unzipped.  On certain platforms
         | 
| 106 | 
            +
                # you have a better chance of getting an atomic move if your temporary working
         | 
| 107 | 
            +
                # directory is on the same device/volume as the  destination.  To support this,
         | 
| 108 | 
            +
                # we use a staging directory located under the cache path under the rather mild
         | 
| 109 | 
            +
                # assumption that everything under the cache path is going to be on one device.
         | 
| 110 | 
            +
                #
         | 
| 111 | 
            +
                # Do not create anything under this directory that isn't randomly named and
         | 
| 112 | 
            +
                # remember to release your files once you are done.
         | 
| 113 | 
            +
                #
         | 
| 114 | 
            +
                # @return [Pathname]
         | 
| 115 | 
            +
                def staging_root
         | 
| 116 | 
            +
                  Pathname.new(CookbookOmnifetch.cache_path).join(".cache_tmp", "artifactserver")
         | 
| 117 | 
            +
                end
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                # The path where the pristine tarball is cached
         | 
| 120 | 
            +
                #
         | 
| 121 | 
            +
                # @return [Pathname]
         | 
| 122 | 
            +
                def cache_path
         | 
| 123 | 
            +
                  cache_root.join("#{cache_key}.tgz")
         | 
| 124 | 
            +
                end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
              end
         | 
| 127 | 
            +
            end
         | 
| @@ -0,0 +1,64 @@ | |
| 1 | 
            +
            require "spec_helper"
         | 
| 2 | 
            +
            require "cookbook-omnifetch/artifactory"
         | 
| 3 | 
            +
            require "zlib"
         | 
| 4 | 
            +
            require "archive/tar/minitar"
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module CookbookOmnifetch
         | 
| 7 | 
            +
              describe ArtifactoryLocation do
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                let(:cookbook_name) { "nginx" }
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                let(:cookbook_version) { "1.5.23" }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                let(:http_client) { double("Chef::HTTP::Simple") }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                let(:constraint) { double("Constraint") }
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                let(:dependency) { double("Dependency", name: cookbook_name, constraint: constraint) }
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                let(:url) { "https://artifactory.example.com/api/v1/cookbooks/nginx/versions/1.5.23/download" }
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                let(:options) { { artifactory: url, version: cookbook_version, http_client: http_client } }
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                subject(:public_repo_location) { described_class.new(dependency, options) }
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                it "has a URI" do
         | 
| 26 | 
            +
                  expect(public_repo_location.uri).to eq(url)
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                it "has a repo host" do
         | 
| 30 | 
            +
                  expect(public_repo_location.repo_host).to eq("artifactory.example.com")
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                it "has an exact version" do
         | 
| 34 | 
            +
                  expect(public_repo_location.cookbook_version).to eq("1.5.23")
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                it "has a cache key containing the site URI and version" do
         | 
| 38 | 
            +
                  expect(public_repo_location.cache_key).to eq("nginx-1.5.23-artifactory.example.com")
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                it "sets the install location as the cache path plus cache key" do
         | 
| 42 | 
            +
                  expected_install_path = Pathname.new("~/.berkshelf/cookbooks").expand_path.join("nginx-1.5.23-artifactory.example.com")
         | 
| 43 | 
            +
                  expect(public_repo_location.install_path).to eq(expected_install_path)
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                it "considers the cookbook installed if it exists in the main cache" do
         | 
| 47 | 
            +
                  expect(public_repo_location.install_path).to receive(:exist?).and_return(true)
         | 
| 48 | 
            +
                  expect(public_repo_location.installed?).to be true
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                it "considers the cookbook not installed if it doesn't exist in the main cache" do
         | 
| 52 | 
            +
                  expect(public_repo_location.install_path).to receive(:exist?).and_return(false)
         | 
| 53 | 
            +
                  expect(public_repo_location.installed?).to be false
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                it "provides lock data as a Hash" do
         | 
| 57 | 
            +
                  expected_data = {
         | 
| 58 | 
            +
                    "artifactory" => url,
         | 
| 59 | 
            +
                    "version" => "1.5.23",
         | 
| 60 | 
            +
                  }
         | 
| 61 | 
            +
                  expect(public_repo_location.lock_data).to eq(expected_data)
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
            end
         | 
| @@ -45,7 +45,7 @@ module CookbookOmnifetch | |
| 45 45 | 
             
                let(:remote_path) { File.join(test_root, "remote") }
         | 
| 46 46 | 
             
                let(:options) { { chef_server: url, version: cookbook_version, http_client: http_client } }
         | 
| 47 47 |  | 
| 48 | 
            -
                let(:cookbook_files) { %w{. .. | 
| 48 | 
            +
                let(:cookbook_files) { %w{. .. metadata.rb recipes} }
         | 
| 49 49 | 
             
                subject(:chef_server_location) { described_class.new(dependency, options) }
         | 
| 50 50 |  | 
| 51 51 | 
             
                before do
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: cookbook-omnifetch
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.6.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Jamie Winsor
         | 
| @@ -13,7 +13,7 @@ authors: | |
| 13 13 | 
             
            autorequire: 
         | 
| 14 14 | 
             
            bindir: bin
         | 
| 15 15 | 
             
            cert_chain: []
         | 
| 16 | 
            -
            date: 2017- | 
| 16 | 
            +
            date: 2017-05-17 00:00:00.000000000 Z
         | 
| 17 17 | 
             
            dependencies:
         | 
| 18 18 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 19 19 | 
             
              name: mixlib-archive
         | 
| @@ -33,16 +33,16 @@ dependencies: | |
| 33 33 | 
             
              name: rake
         | 
| 34 34 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 35 35 | 
             
                requirements:
         | 
| 36 | 
            -
                - - " | 
| 36 | 
            +
                - - ">="
         | 
| 37 37 | 
             
                  - !ruby/object:Gem::Version
         | 
| 38 | 
            -
                    version: ' | 
| 38 | 
            +
                    version: '0'
         | 
| 39 39 | 
             
              type: :development
         | 
| 40 40 | 
             
              prerelease: false
         | 
| 41 41 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 42 42 | 
             
                requirements:
         | 
| 43 | 
            -
                - - " | 
| 43 | 
            +
                - - ">="
         | 
| 44 44 | 
             
                  - !ruby/object:Gem::Version
         | 
| 45 | 
            -
                    version: ' | 
| 45 | 
            +
                    version: '0'
         | 
| 46 46 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 47 47 | 
             
              name: rspec
         | 
| 48 48 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -78,6 +78,7 @@ files: | |
| 78 78 | 
             
            - Rakefile
         | 
| 79 79 | 
             
            - cookbook-omnifetch.gemspec
         | 
| 80 80 | 
             
            - lib/cookbook-omnifetch.rb
         | 
| 81 | 
            +
            - lib/cookbook-omnifetch/artifactory.rb
         | 
| 81 82 | 
             
            - lib/cookbook-omnifetch/artifactserver.rb
         | 
| 82 83 | 
             
            - lib/cookbook-omnifetch/base.rb
         | 
| 83 84 | 
             
            - lib/cookbook-omnifetch/chef_server.rb
         | 
| @@ -98,6 +99,7 @@ files: | |
| 98 99 | 
             
            - spec/fixtures/cookbooks/example_cookbook/metadata.rb
         | 
| 99 100 | 
             
            - spec/fixtures/cookbooks/example_cookbook/recipes/default.rb
         | 
| 100 101 | 
             
            - spec/spec_helper.rb
         | 
| 102 | 
            +
            - spec/unit/artifactory_spec.rb
         | 
| 101 103 | 
             
            - spec/unit/artifactserver_spec.rb
         | 
| 102 104 | 
             
            - spec/unit/base_spec.rb
         | 
| 103 105 | 
             
            - spec/unit/chef_server_spec.rb
         | 
| @@ -124,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 124 126 | 
             
                  version: '0'
         | 
| 125 127 | 
             
            requirements: []
         | 
| 126 128 | 
             
            rubyforge_project: 
         | 
| 127 | 
            -
            rubygems_version: 2. | 
| 129 | 
            +
            rubygems_version: 2.6.11
         | 
| 128 130 | 
             
            signing_key: 
         | 
| 129 131 | 
             
            specification_version: 4
         | 
| 130 132 | 
             
            summary: Library code to fetch Chef cookbooks from a variety of sources to a local
         | 
| @@ -141,6 +143,7 @@ test_files: | |
| 141 143 | 
             
            - spec/fixtures/cookbooks/example_cookbook/metadata.rb
         | 
| 142 144 | 
             
            - spec/fixtures/cookbooks/example_cookbook/recipes/default.rb
         | 
| 143 145 | 
             
            - spec/spec_helper.rb
         | 
| 146 | 
            +
            - spec/unit/artifactory_spec.rb
         | 
| 144 147 | 
             
            - spec/unit/artifactserver_spec.rb
         | 
| 145 148 | 
             
            - spec/unit/base_spec.rb
         | 
| 146 149 | 
             
            - spec/unit/chef_server_spec.rb
         |