cheffish 0.8 → 0.8.1
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/chef/provider/chef_mirror.rb +29 -3
- data/lib/chef/resource/chef_mirror.rb +2 -1
- data/lib/cheffish/chef_provider_base.rb +1 -1
- data/lib/cheffish/recipe_dsl.rb +1 -1
- data/lib/cheffish/version.rb +1 -1
- data/spec/integration/chef_client_spec.rb +1 -1
- data/spec/integration/chef_container_spec.rb +1 -1
- data/spec/integration/chef_group_spec.rb +1 -1
- data/spec/integration/chef_mirror_spec.rb +333 -58
- data/spec/integration/chef_node_spec.rb +45 -1
- data/spec/integration/chef_organization_spec.rb +1 -1
- data/spec/integration/chef_user_spec.rb +1 -1
- data/spec/support/spec_support.rb +6 -0
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 338276289ac7fab89d006bc453e20266560948b7
         | 
| 4 | 
            +
              data.tar.gz: 60ac99761729f96b46b5d12f38101fcf930008cc
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: d2fbe1a958c572c4c885d8bea5c2453bbd0cfbb9cd0fbba63a15cf47eb7266b946f66a900549b1a9f6b45186f378a01312c573accdadfc84c520b5a288a99753
         | 
| 7 | 
            +
              data.tar.gz: 0676d6791b22f25d28ce7977b4e905e10bb8ab2cf44059af0b1cc6175ae6dcad98cebc73024dbb352829405a7237575f862559032105d13c4e95a0aa4270d7f7
         | 
| @@ -12,11 +12,36 @@ class Chef::Provider::ChefMirror < Chef::Provider::LWRPBase | |
| 12 12 | 
             
              end
         | 
| 13 13 |  | 
| 14 14 | 
             
              action :upload do
         | 
| 15 | 
            -
                 | 
| 15 | 
            +
                with_modified_config do
         | 
| 16 | 
            +
                  copy_to(local_fs, remote_fs)
         | 
| 17 | 
            +
                end
         | 
| 16 18 | 
             
              end
         | 
| 17 19 |  | 
| 18 20 | 
             
              action :download do
         | 
| 19 | 
            -
                 | 
| 21 | 
            +
                with_modified_config do
         | 
| 22 | 
            +
                  copy_to(remote_fs, local_fs)
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              def with_modified_config
         | 
| 27 | 
            +
                # pre-Chef-12 ChefFS reads versioned_cookbooks out of Chef::Config instead of
         | 
| 28 | 
            +
                # taking it as an input, so we need to modify it for the duration of copy_to
         | 
| 29 | 
            +
                @old_versioned_cookbooks = Chef::Config.versioned_cookbooks
         | 
| 30 | 
            +
                # If versioned_cookbooks is explicitly set, set it.
         | 
| 31 | 
            +
                if !new_resource.versioned_cookbooks.nil?
         | 
| 32 | 
            +
                  Chef::Config.versioned_cookbooks = new_resource.versioned_cookbooks
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                # If new_resource.chef_repo_path is set, versioned_cookbooks defaults to true.
         | 
| 35 | 
            +
                # Otherwise, it stays at its current Chef::Config value.
         | 
| 36 | 
            +
                elsif new_resource.chef_repo_path
         | 
| 37 | 
            +
                  Chef::Config.versioned_cookbooks = true
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                begin
         | 
| 41 | 
            +
                  yield
         | 
| 42 | 
            +
                ensure
         | 
| 43 | 
            +
                  Chef::Config.versioned_cookbooks = @old_versioned_cookbooks
         | 
| 44 | 
            +
                end
         | 
| 20 45 | 
             
              end
         | 
| 21 46 |  | 
| 22 47 | 
             
              def copy_to(src_root, dest_root)
         | 
| @@ -84,7 +109,8 @@ class Chef::Provider::ChefMirror < Chef::Provider::LWRPBase | |
| 84 109 | 
             
                  :chef_server_url => new_resource.chef_server[:chef_server_url],
         | 
| 85 110 | 
             
                  :node_name => new_resource.chef_server[:options][:client_name],
         | 
| 86 111 | 
             
                  :client_key => new_resource.chef_server[:options][:client_key],
         | 
| 87 | 
            -
                  :repo_mode => repo_mode
         | 
| 112 | 
            +
                  :repo_mode => repo_mode,
         | 
| 113 | 
            +
                  :versioned_cookbooks => Chef::Config.versioned_cookbooks
         | 
| 88 114 | 
             
                }
         | 
| 89 115 | 
             
                Chef::ChefFS::FileSystem::ChefServerRootDir.new("remote", config)
         | 
| 90 116 | 
             
              end
         | 
| @@ -23,8 +23,9 @@ class Chef::Resource::ChefMirror < Chef::Resource::LWRPBase | |
| 23 23 | 
             
              # versioned_cookbooks defaults to true.
         | 
| 24 24 | 
             
              attribute :chef_repo_path, :kind_of => [ String, Hash ]
         | 
| 25 25 |  | 
| 26 | 
            -
              # Whether the repo path  | 
| 26 | 
            +
              # Whether the repo path should contain cookbooks with versioned names,
         | 
| 27 27 | 
             
              # i.e. cookbooks/mysql-1.0.0, cookbooks/mysql-1.2.0, etc.
         | 
| 28 | 
            +
              # Defaults to true if chef_repo_path is specified, or to Chef::Config.versioned_cookbooks otherwise.
         | 
| 28 29 | 
             
              attribute :versioned_cookbooks, :kind_of => [ TrueClass, FalseClass ]
         | 
| 29 30 |  | 
| 30 31 | 
             
              # Chef server
         | 
| @@ -32,7 +32,7 @@ module Cheffish | |
| 32 32 | 
             
                      result = normalize(resource_to_json(new_resource))
         | 
| 33 33 | 
             
                    else
         | 
| 34 34 | 
             
                      # If resource is incomplete, use current json to fill any holes
         | 
| 35 | 
            -
                      result =  | 
| 35 | 
            +
                      result = Chef::Mixin::DeepMerge.hash_only_merge(current_json, resource_to_json(new_resource))
         | 
| 36 36 | 
             
                    end
         | 
| 37 37 | 
             
                    augment_new_json(result)
         | 
| 38 38 | 
             
                  end
         | 
    
        data/lib/cheffish/recipe_dsl.rb
    CHANGED
    
    
    
        data/lib/cheffish/version.rb
    CHANGED
    
    
| @@ -8,7 +8,7 @@ repo_path = Dir.mktmpdir('chef_repo') | |
| 8 8 | 
             
            describe Chef::Resource::ChefClient do
         | 
| 9 9 | 
             
              extend SpecSupport
         | 
| 10 10 |  | 
| 11 | 
            -
               | 
| 11 | 
            +
              when_the_chef_12_server 'is in multi-org mode' do
         | 
| 12 12 | 
             
                organization 'foo'
         | 
| 13 13 |  | 
| 14 14 | 
             
                before :each do
         | 
| @@ -5,7 +5,7 @@ require 'chef/provider/chef_container' | |
| 5 5 | 
             
            describe Chef::Resource::ChefContainer do
         | 
| 6 6 | 
             
              extend SpecSupport
         | 
| 7 7 |  | 
| 8 | 
            -
               | 
| 8 | 
            +
              when_the_chef_12_server 'is in multi-org mode' do
         | 
| 9 9 | 
             
                organization 'foo'
         | 
| 10 10 |  | 
| 11 11 | 
             
                before :each do
         | 
| @@ -5,7 +5,7 @@ require 'chef/provider/chef_group' | |
| 5 5 | 
             
            describe Chef::Resource::ChefGroup do
         | 
| 6 6 | 
             
              extend SpecSupport
         | 
| 7 7 |  | 
| 8 | 
            -
               | 
| 8 | 
            +
              when_the_chef_12_server 'is in multi-org mode' do
         | 
| 9 9 | 
             
                organization 'foo'
         | 
| 10 10 |  | 
| 11 11 | 
             
                before :each do
         | 
| @@ -5,17 +5,20 @@ require 'chef/provider/chef_mirror' | |
| 5 5 | 
             
            describe Chef::Resource::ChefMirror do
         | 
| 6 6 | 
             
              extend SpecSupport
         | 
| 7 7 |  | 
| 8 | 
            -
               | 
| 8 | 
            +
              when_the_chef_12_server 'is in multi-org mode' do
         | 
| 9 9 | 
             
                organization 'foo'
         | 
| 10 10 |  | 
| 11 11 | 
             
                before :each do
         | 
| 12 12 | 
             
                  Chef::Config.chef_server_url = URI.join(Chef::Config.chef_server_url, '/organizations/foo').to_s
         | 
| 13 13 | 
             
                end
         | 
| 14 14 |  | 
| 15 | 
            -
                 | 
| 15 | 
            +
                describe 'basic download and upload' do
         | 
| 16 16 | 
             
                  when_the_repository 'is full of stuff' do
         | 
| 17 17 | 
             
                    file 'nodes/x.json', {}
         | 
| 18 18 | 
             
                    file 'roles/x.json', {}
         | 
| 19 | 
            +
                    directory 'cookbooks/x' do
         | 
| 20 | 
            +
                      file 'metadata.rb', 'name "x"; version "2.0.0"'
         | 
| 21 | 
            +
                    end
         | 
| 19 22 |  | 
| 20 23 | 
             
                    it "Download grabs defaults" do
         | 
| 21 24 | 
             
                      run_recipe do
         | 
| @@ -37,6 +40,7 @@ describe Chef::Resource::ChefMirror do | |
| 37 40 | 
             
                      expect(chef_run).to have_updated('chef_mirror[]', :upload)
         | 
| 38 41 | 
             
                      expect { get('nodes/x') }.not_to raise_error
         | 
| 39 42 | 
             
                      expect { get('roles/x') }.not_to raise_error
         | 
| 43 | 
            +
                      expect { get('cookbooks/x/2.0.0') }.not_to raise_error
         | 
| 40 44 | 
             
                    end
         | 
| 41 45 |  | 
| 42 46 | 
             
                    it 'chef_mirror with concurrency 0 fails with a reasonable message' do
         | 
| @@ -50,7 +54,96 @@ describe Chef::Resource::ChefMirror do | |
| 50 54 | 
             
                      }.to raise_error /chef_mirror.concurrency must be above 0/
         | 
| 51 55 | 
             
                    end
         | 
| 52 56 | 
             
                  end
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                context 'and the Chef server has a node and role in it' do
         | 
| 60 | 
            +
                  node 'x', {}
         | 
| 61 | 
            +
                  role 'x', {}
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                  when_the_repository 'is empty' do
         | 
| 64 | 
            +
                    it "Download grabs the node and role" do
         | 
| 65 | 
            +
                      run_recipe do
         | 
| 66 | 
            +
                        chef_mirror '' do
         | 
| 67 | 
            +
                          action :download
         | 
| 68 | 
            +
                        end
         | 
| 69 | 
            +
                      end
         | 
| 70 | 
            +
                      expect(chef_run).to have_updated('chef_mirror[]', :download)
         | 
| 71 | 
            +
                      expect(File.exist?(path_to('nodes/x.json'))).to be true
         | 
| 72 | 
            +
                      expect(File.exist?(path_to('roles/x.json'))).to be true
         | 
| 73 | 
            +
                    end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                    it "Upload uploads nothing" do
         | 
| 76 | 
            +
                      run_recipe do
         | 
| 77 | 
            +
                        chef_mirror '' do
         | 
| 78 | 
            +
                          action :upload
         | 
| 79 | 
            +
                        end
         | 
| 80 | 
            +
                      end
         | 
| 81 | 
            +
                      expect(chef_run).not_to have_updated('chef_mirror[]', :upload)
         | 
| 82 | 
            +
                    end
         | 
| 83 | 
            +
                  end
         | 
| 84 | 
            +
                end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                context 'and the Chef server has nodes and roles named x' do
         | 
| 87 | 
            +
                  node 'x', {}
         | 
| 88 | 
            +
                  role 'x', {}
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                  when_the_repository 'has nodes and roles named y' do
         | 
| 91 | 
            +
                    file 'nodes/y.json', {}
         | 
| 92 | 
            +
                    file 'roles/y.json', {}
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                    it "Download grabs the x's" do
         | 
| 95 | 
            +
                      run_recipe do
         | 
| 96 | 
            +
                        chef_mirror '' do
         | 
| 97 | 
            +
                          action :download
         | 
| 98 | 
            +
                        end
         | 
| 99 | 
            +
                      end
         | 
| 100 | 
            +
                      expect(chef_run).to have_updated('chef_mirror[]', :download)
         | 
| 101 | 
            +
                      expect(File.exist?(path_to('nodes/x.json'))).to be true
         | 
| 102 | 
            +
                      expect(File.exist?(path_to('roles/x.json'))).to be true
         | 
| 103 | 
            +
                      expect(File.exist?(path_to('nodes/y.json'))).to be true
         | 
| 104 | 
            +
                      expect(File.exist?(path_to('roles/y.json'))).to be true
         | 
| 105 | 
            +
                    end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                    it "Upload uploads the y's" do
         | 
| 108 | 
            +
                      run_recipe do
         | 
| 109 | 
            +
                        chef_mirror '' do
         | 
| 110 | 
            +
                          action :upload
         | 
| 111 | 
            +
                        end
         | 
| 112 | 
            +
                      end
         | 
| 113 | 
            +
                      expect(chef_run).to have_updated('chef_mirror[]', :upload)
         | 
| 114 | 
            +
                      expect { get('nodes/x') }.not_to raise_error
         | 
| 115 | 
            +
                      expect { get('roles/x') }.not_to raise_error
         | 
| 116 | 
            +
                      expect { get('nodes/y') }.not_to raise_error
         | 
| 117 | 
            +
                      expect { get('roles/y') }.not_to raise_error
         | 
| 118 | 
            +
                    end
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                    it "Download with purge grabs the x's and deletes the y's" do
         | 
| 121 | 
            +
                      run_recipe do
         | 
| 122 | 
            +
                        chef_mirror '' do
         | 
| 123 | 
            +
                          purge true
         | 
| 124 | 
            +
                          action :download
         | 
| 125 | 
            +
                        end
         | 
| 126 | 
            +
                      end
         | 
| 127 | 
            +
                      expect(chef_run).to have_updated('chef_mirror[]', :download)
         | 
| 128 | 
            +
                      expect(File.exist?(path_to('nodes/x.json'))).to be true
         | 
| 129 | 
            +
                      expect(File.exist?(path_to('roles/x.json'))).to be true
         | 
| 130 | 
            +
                    end
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                    it "Upload with :purge uploads the y's and deletes the x's" do
         | 
| 133 | 
            +
                      run_recipe do
         | 
| 134 | 
            +
                        chef_mirror '*/*.json' do
         | 
| 135 | 
            +
                          purge true
         | 
| 136 | 
            +
                          action :upload
         | 
| 137 | 
            +
                        end
         | 
| 138 | 
            +
                      end
         | 
| 139 | 
            +
                      expect(chef_run).to have_updated('chef_mirror[*/*.json]', :upload)
         | 
| 140 | 
            +
                      expect { get('nodes/y') }.not_to raise_error
         | 
| 141 | 
            +
                      expect { get('roles/y') }.not_to raise_error
         | 
| 142 | 
            +
                    end
         | 
| 143 | 
            +
                  end
         | 
| 144 | 
            +
                end
         | 
| 53 145 |  | 
| 146 | 
            +
                describe "chef_repo_path" do
         | 
| 54 147 | 
             
                  when_the_repository 'has stuff but no chef_repo_path' do
         | 
| 55 148 | 
             
                    file 'repo/nodes/x.json', {}
         | 
| 56 149 | 
             
                    file 'repo/roles/x.json', {}
         | 
| @@ -153,92 +246,274 @@ describe Chef::Resource::ChefMirror do | |
| 153 246 | 
             
                  end
         | 
| 154 247 | 
             
                end
         | 
| 155 248 |  | 
| 156 | 
            -
                 | 
| 157 | 
            -
                   | 
| 158 | 
            -
             | 
| 249 | 
            +
                describe "cookbook upload, chef_repo_path and versioned_cookbooks" do
         | 
| 250 | 
            +
                  when_the_repository 'has cookbooks in non-versioned format' do
         | 
| 251 | 
            +
                    file 'cookbooks/x-1.0.0/metadata.rb', 'name "x-1.0.0"; version "2.0.0"'
         | 
| 252 | 
            +
                    file 'cookbooks/y-1.0.0/metadata.rb', 'name "y-3.0.0"; version "4.0.0"'
         | 
| 159 253 |  | 
| 160 | 
            -
             | 
| 161 | 
            -
                    it "Download grabs stuff" do
         | 
| 254 | 
            +
                    it "chef_mirror :upload uploads everything" do
         | 
| 162 255 | 
             
                      run_recipe do
         | 
| 163 256 | 
             
                        chef_mirror '' do
         | 
| 164 | 
            -
                          action : | 
| 257 | 
            +
                          action :upload
         | 
| 165 258 | 
             
                        end
         | 
| 166 259 | 
             
                      end
         | 
| 167 | 
            -
                      expect(chef_run).to have_updated('chef_mirror[]', : | 
| 168 | 
            -
                      expect( | 
| 169 | 
            -
                      expect( | 
| 260 | 
            +
                      expect(chef_run).to have_updated('chef_mirror[]', :upload)
         | 
| 261 | 
            +
                      expect { get('cookbooks/x-1.0.0/2.0.0') }.not_to raise_error
         | 
| 262 | 
            +
                      expect { get('cookbooks/y-3.0.0/4.0.0') }.not_to raise_error
         | 
| 170 263 | 
             
                    end
         | 
| 171 264 |  | 
| 172 | 
            -
                     | 
| 173 | 
            -
                       | 
| 174 | 
            -
                         | 
| 175 | 
            -
             | 
| 265 | 
            +
                    context 'and Chef::Config.versioned_cookbooks is false' do
         | 
| 266 | 
            +
                      before do
         | 
| 267 | 
            +
                        Chef::Config.versioned_cookbooks false
         | 
| 268 | 
            +
                      end
         | 
| 269 | 
            +
                      it "chef_mirror :upload uploads everything" do
         | 
| 270 | 
            +
                        run_recipe do
         | 
| 271 | 
            +
                          chef_mirror '' do
         | 
| 272 | 
            +
                            action :upload
         | 
| 273 | 
            +
                          end
         | 
| 176 274 | 
             
                        end
         | 
| 275 | 
            +
                        expect(chef_run).to have_updated('chef_mirror[]', :upload)
         | 
| 276 | 
            +
                        expect { get('cookbooks/x-1.0.0/2.0.0') }.not_to raise_error
         | 
| 277 | 
            +
                        expect { get('cookbooks/y-3.0.0/4.0.0') }.not_to raise_error
         | 
| 177 278 | 
             
                      end
         | 
| 178 | 
            -
                      expect(chef_run).not_to have_updated('chef_mirror[]', :upload)
         | 
| 179 279 | 
             
                    end
         | 
| 180 | 
            -
                  end
         | 
| 181 | 
            -
                end
         | 
| 182 280 |  | 
| 183 | 
            -
             | 
| 184 | 
            -
             | 
| 185 | 
            -
             | 
| 281 | 
            +
                    context 'and Chef::Config.chef_repo_path is not set but versioned_cookbooks is false' do
         | 
| 282 | 
            +
                      before do
         | 
| 283 | 
            +
                        Chef::Config.delete(:chef_repo_path)
         | 
| 284 | 
            +
                        Chef::Config.versioned_cookbooks false
         | 
| 285 | 
            +
                      end
         | 
| 186 286 |  | 
| 187 | 
            -
             | 
| 188 | 
            -
             | 
| 189 | 
            -
             | 
| 287 | 
            +
                      it "chef_mirror :upload with chef_repo_path and versioned_cookbooks false uploads cookbooks with name including version" do
         | 
| 288 | 
            +
                        repository_dir = @repository_dir
         | 
| 289 | 
            +
                        run_recipe do
         | 
| 290 | 
            +
                          chef_mirror '' do
         | 
| 291 | 
            +
                            chef_repo_path repository_dir
         | 
| 292 | 
            +
                            versioned_cookbooks false
         | 
| 293 | 
            +
                            action :upload
         | 
| 294 | 
            +
                          end
         | 
| 295 | 
            +
                        end
         | 
| 296 | 
            +
                        expect(chef_run).to have_updated('chef_mirror[]', :upload)
         | 
| 297 | 
            +
                        expect { get('cookbooks/x-1.0.0/2.0.0') }.not_to raise_error
         | 
| 298 | 
            +
                        expect { get('cookbooks/y-3.0.0/4.0.0') }.not_to raise_error
         | 
| 299 | 
            +
                      end
         | 
| 300 | 
            +
                    end
         | 
| 301 | 
            +
                  end
         | 
| 190 302 |  | 
| 191 | 
            -
             | 
| 192 | 
            -
             | 
| 193 | 
            -
             | 
| 194 | 
            -
             | 
| 303 | 
            +
                  when_the_repository 'has cookbooks in versioned_cookbook format' do
         | 
| 304 | 
            +
                    file 'cookbooks/x-1.0.0/metadata.rb', 'name "x"; version "1.0.0"'
         | 
| 305 | 
            +
                    file 'cookbooks/x-2.0.0/metadata.rb', 'name "x"; version "2.0.0"'
         | 
| 306 | 
            +
             | 
| 307 | 
            +
                    context 'and Chef::Config.versioned_cookbooks is true' do
         | 
| 308 | 
            +
                      before do
         | 
| 309 | 
            +
                        Chef::Config.versioned_cookbooks true
         | 
| 310 | 
            +
                      end
         | 
| 311 | 
            +
                      it "chef_mirror :upload uploads everything" do
         | 
| 312 | 
            +
                        run_recipe do
         | 
| 313 | 
            +
                          chef_mirror '' do
         | 
| 314 | 
            +
                            action :upload
         | 
| 315 | 
            +
                          end
         | 
| 195 316 | 
             
                        end
         | 
| 317 | 
            +
                        expect(chef_run).to have_updated('chef_mirror[]', :upload)
         | 
| 318 | 
            +
                        expect { get('cookbooks/x/1.0.0') }.not_to raise_error
         | 
| 319 | 
            +
                        expect { get('cookbooks/x/2.0.0') }.not_to raise_error
         | 
| 196 320 | 
             
                      end
         | 
| 197 | 
            -
                      expect(chef_run).to have_updated('chef_mirror[]', :download)
         | 
| 198 | 
            -
                      expect(File.exist?(path_to('nodes/x.json'))).to be true
         | 
| 199 | 
            -
                      expect(File.exist?(path_to('roles/x.json'))).to be true
         | 
| 200 | 
            -
                      expect(File.exist?(path_to('nodes/y.json'))).to be true
         | 
| 201 | 
            -
                      expect(File.exist?(path_to('roles/y.json'))).to be true
         | 
| 202 321 | 
             
                    end
         | 
| 203 322 |  | 
| 204 | 
            -
                     | 
| 205 | 
            -
                       | 
| 206 | 
            -
                         | 
| 207 | 
            -
             | 
| 323 | 
            +
                    context 'and Chef::Config.chef_repo_path set somewhere else' do
         | 
| 324 | 
            +
                      before do
         | 
| 325 | 
            +
                        Chef::Config.chef_repo_path = '/x/y/z'
         | 
| 326 | 
            +
                      end
         | 
| 327 | 
            +
                      it "chef_mirror :upload with chef_repo_path uploads cookbooks" do
         | 
| 328 | 
            +
                        repository_dir = @repository_dir
         | 
| 329 | 
            +
                        run_recipe do
         | 
| 330 | 
            +
                          chef_mirror '' do
         | 
| 331 | 
            +
                            chef_repo_path repository_dir
         | 
| 332 | 
            +
                            action :upload
         | 
| 333 | 
            +
                          end
         | 
| 208 334 | 
             
                        end
         | 
| 335 | 
            +
                        expect(chef_run).to have_updated('chef_mirror[]', :upload)
         | 
| 336 | 
            +
                        expect { get('cookbooks/x/1.0.0') }.not_to raise_error
         | 
| 337 | 
            +
                        expect { get('cookbooks/x/2.0.0') }.not_to raise_error
         | 
| 209 338 | 
             
                      end
         | 
| 210 | 
            -
                      expect(chef_run).to have_updated('chef_mirror[]', :upload)
         | 
| 211 | 
            -
                      expect { get('nodes/x') }.not_to raise_error
         | 
| 212 | 
            -
                      expect { get('roles/x') }.not_to raise_error
         | 
| 213 | 
            -
                      expect { get('nodes/y') }.not_to raise_error
         | 
| 214 | 
            -
                      expect { get('roles/y') }.not_to raise_error
         | 
| 215 339 | 
             
                    end
         | 
| 216 340 |  | 
| 217 | 
            -
                     | 
| 218 | 
            -
                       | 
| 219 | 
            -
                         | 
| 220 | 
            -
             | 
| 221 | 
            -
             | 
| 341 | 
            +
                    context 'and Chef::Config.chef_repo_path is not set but versioned_cookbooks is false' do
         | 
| 342 | 
            +
                      before do
         | 
| 343 | 
            +
                        Chef::Config.delete(:chef_repo_path)
         | 
| 344 | 
            +
                        Chef::Config.versioned_cookbooks false
         | 
| 345 | 
            +
                      end
         | 
| 346 | 
            +
             | 
| 347 | 
            +
                      it "chef_mirror :upload with chef_repo_path uploads cookbooks with name split from version" do
         | 
| 348 | 
            +
                        repository_dir = @repository_dir
         | 
| 349 | 
            +
                        run_recipe do
         | 
| 350 | 
            +
                          chef_mirror '' do
         | 
| 351 | 
            +
                            chef_repo_path repository_dir
         | 
| 352 | 
            +
                            action :upload
         | 
| 353 | 
            +
                          end
         | 
| 222 354 | 
             
                        end
         | 
| 355 | 
            +
                        expect(chef_run).to have_updated('chef_mirror[]', :upload)
         | 
| 356 | 
            +
                        expect { get('cookbooks/x/1.0.0') }.not_to raise_error
         | 
| 357 | 
            +
                        expect { get('cookbooks/x/2.0.0') }.not_to raise_error
         | 
| 358 | 
            +
                      end
         | 
| 359 | 
            +
             | 
| 360 | 
            +
                      it "chef_mirror :upload with chef_repo_path and versioned_cookbooks uploads cookbooks with name split from version" do
         | 
| 361 | 
            +
                        repository_dir = @repository_dir
         | 
| 362 | 
            +
                        run_recipe do
         | 
| 363 | 
            +
                          chef_mirror '' do
         | 
| 364 | 
            +
                            chef_repo_path repository_dir
         | 
| 365 | 
            +
                            versioned_cookbooks true
         | 
| 366 | 
            +
                            action :upload
         | 
| 367 | 
            +
                          end
         | 
| 368 | 
            +
                        end
         | 
| 369 | 
            +
                        expect(chef_run).to have_updated('chef_mirror[]', :upload)
         | 
| 370 | 
            +
                        expect { get('cookbooks/x/1.0.0') }.not_to raise_error
         | 
| 371 | 
            +
                        expect { get('cookbooks/x/2.0.0') }.not_to raise_error
         | 
| 223 372 | 
             
                      end
         | 
| 224 | 
            -
                      expect(chef_run).to have_updated('chef_mirror[]', :download)
         | 
| 225 | 
            -
                      expect(File.exist?(path_to('nodes/x.json'))).to be true
         | 
| 226 | 
            -
                      expect(File.exist?(path_to('roles/x.json'))).to be true
         | 
| 227 373 | 
             
                    end
         | 
| 228 374 |  | 
| 229 | 
            -
                     | 
| 230 | 
            -
                       | 
| 231 | 
            -
                         | 
| 232 | 
            -
             | 
| 233 | 
            -
             | 
| 375 | 
            +
                    context 'and Chef::Config.chef_repo_path is not set but versioned_cookbooks is true' do
         | 
| 376 | 
            +
                      before do
         | 
| 377 | 
            +
                        Chef::Config.delete(:chef_repo_path)
         | 
| 378 | 
            +
                        Chef::Config.versioned_cookbooks true
         | 
| 379 | 
            +
                      end
         | 
| 380 | 
            +
                      it "chef_mirror :upload with chef_repo_path uploads cookbooks with name split from version" do
         | 
| 381 | 
            +
                        repository_dir = @repository_dir
         | 
| 382 | 
            +
                        run_recipe do
         | 
| 383 | 
            +
                          chef_mirror '' do
         | 
| 384 | 
            +
                            chef_repo_path repository_dir
         | 
| 385 | 
            +
                            action :upload
         | 
| 386 | 
            +
                          end
         | 
| 234 387 | 
             
                        end
         | 
| 388 | 
            +
                        expect(chef_run).to have_updated('chef_mirror[]', :upload)
         | 
| 389 | 
            +
                        expect { get('cookbooks/x/1.0.0') }.not_to raise_error
         | 
| 390 | 
            +
                        expect { get('cookbooks/x/2.0.0') }.not_to raise_error
         | 
| 235 391 | 
             
                      end
         | 
| 236 | 
            -
                      expect(chef_run).to have_updated('chef_mirror[*/*.json]', :upload)
         | 
| 237 | 
            -
                      expect { get('nodes/y') }.not_to raise_error
         | 
| 238 | 
            -
                      expect { get('roles/y') }.not_to raise_error
         | 
| 239 392 | 
             
                    end
         | 
| 240 393 | 
             
                  end
         | 
| 241 394 | 
             
                end
         | 
| 242 395 |  | 
| 396 | 
            +
                describe 'cookbook download, chef_repo_path, and versioned_cookbooks' do
         | 
| 397 | 
            +
                  context 'when the Chef server has a cookbook with multiple versions' do
         | 
| 398 | 
            +
                    cookbook 'x', '1.0.0', 'metadata.rb' => 'name "x"; version "1.0.0"'
         | 
| 399 | 
            +
                    cookbook 'x', '2.0.0', 'metadata.rb' => 'name "x"; version "2.0.0"'
         | 
| 400 | 
            +
             | 
| 401 | 
            +
                    when_the_repository 'is empty' do
         | 
| 402 | 
            +
                      it 'chef_mirror :download downloads the latest version of the cookbook' do
         | 
| 403 | 
            +
                        run_recipe do
         | 
| 404 | 
            +
                          chef_mirror '' do
         | 
| 405 | 
            +
                            action :download
         | 
| 406 | 
            +
                          end
         | 
| 407 | 
            +
                        end
         | 
| 408 | 
            +
                        expect(chef_run).to have_updated('chef_mirror[]', :download)
         | 
| 409 | 
            +
                        expect(File.read(path_to('cookbooks/x/metadata.rb'))).to eq('name "x"; version "2.0.0"')
         | 
| 410 | 
            +
                      end
         | 
| 411 | 
            +
             | 
| 412 | 
            +
                      it 'chef_mirror :download with versioned_cookbooks = true downloads all versions of the cookbook' do
         | 
| 413 | 
            +
                        run_recipe do
         | 
| 414 | 
            +
                          chef_mirror '' do
         | 
| 415 | 
            +
                            versioned_cookbooks true
         | 
| 416 | 
            +
                            action :download
         | 
| 417 | 
            +
                          end
         | 
| 418 | 
            +
                        end
         | 
| 419 | 
            +
                        expect(chef_run).to have_updated('chef_mirror[]', :download)
         | 
| 420 | 
            +
                        expect(File.read(path_to('cookbooks/x-1.0.0/metadata.rb'))).to eq('name "x"; version "1.0.0"')
         | 
| 421 | 
            +
                        expect(File.read(path_to('cookbooks/x-2.0.0/metadata.rb'))).to eq('name "x"; version "2.0.0"')
         | 
| 422 | 
            +
                      end
         | 
| 423 | 
            +
             | 
| 424 | 
            +
                      context 'and Chef::Config.chef_repo_path is set elsewhere' do
         | 
| 425 | 
            +
                        before do
         | 
| 426 | 
            +
                          Chef::Config.chef_repo_path = '/x/y/z'
         | 
| 427 | 
            +
                        end
         | 
| 428 | 
            +
             | 
| 429 | 
            +
                        it 'chef_mirror :download with chef_repo_path downloads all versions of the cookbook' do
         | 
| 430 | 
            +
                          repository_dir = @repository_dir
         | 
| 431 | 
            +
                          run_recipe do
         | 
| 432 | 
            +
                            chef_mirror '' do
         | 
| 433 | 
            +
                              chef_repo_path repository_dir
         | 
| 434 | 
            +
                              action :download
         | 
| 435 | 
            +
                            end
         | 
| 436 | 
            +
                          end
         | 
| 437 | 
            +
                          expect(chef_run).to have_updated('chef_mirror[]', :download)
         | 
| 438 | 
            +
                          expect(File.read(path_to('cookbooks/x-1.0.0/metadata.rb'))).to eq('name "x"; version "1.0.0"')
         | 
| 439 | 
            +
                          expect(File.read(path_to('cookbooks/x-2.0.0/metadata.rb'))).to eq('name "x"; version "2.0.0"')
         | 
| 440 | 
            +
                        end
         | 
| 441 | 
            +
             | 
| 442 | 
            +
                        it 'chef_mirror :download with chef_repo_path and versioned_cookbooks = false downloads the latest version of the cookbook' do
         | 
| 443 | 
            +
                          repository_dir = @repository_dir
         | 
| 444 | 
            +
                          run_recipe do
         | 
| 445 | 
            +
                            chef_mirror '' do
         | 
| 446 | 
            +
                              chef_repo_path repository_dir
         | 
| 447 | 
            +
                              versioned_cookbooks false
         | 
| 448 | 
            +
                              action :download
         | 
| 449 | 
            +
                            end
         | 
| 450 | 
            +
                          end
         | 
| 451 | 
            +
                          expect(chef_run).to have_updated('chef_mirror[]', :download)
         | 
| 452 | 
            +
                          expect(File.read(path_to('cookbooks/x/metadata.rb'))).to eq('name "x"; version "2.0.0"')
         | 
| 453 | 
            +
                        end
         | 
| 454 | 
            +
                      end
         | 
| 455 | 
            +
             | 
| 456 | 
            +
                      context 'and Chef::Config.versioned_cookbooks is true' do
         | 
| 457 | 
            +
                        before do
         | 
| 458 | 
            +
                          Chef::Config.versioned_cookbooks = true
         | 
| 459 | 
            +
                        end
         | 
| 460 | 
            +
             | 
| 461 | 
            +
                        it 'chef_mirror :download downloads all versions of the cookbook' do
         | 
| 462 | 
            +
                          run_recipe do
         | 
| 463 | 
            +
                            chef_mirror '' do
         | 
| 464 | 
            +
                              action :download
         | 
| 465 | 
            +
                            end
         | 
| 466 | 
            +
                          end
         | 
| 467 | 
            +
                          expect(chef_run).to have_updated('chef_mirror[]', :download)
         | 
| 468 | 
            +
                          expect(File.read(path_to('cookbooks/x-1.0.0/metadata.rb'))).to eq('name "x"; version "1.0.0"')
         | 
| 469 | 
            +
                          expect(File.read(path_to('cookbooks/x-2.0.0/metadata.rb'))).to eq('name "x"; version "2.0.0"')
         | 
| 470 | 
            +
                        end
         | 
| 471 | 
            +
             | 
| 472 | 
            +
                        it 'chef_mirror :download with versioned_cookbooks = false downloads the latest version of the cookbook' do
         | 
| 473 | 
            +
                          run_recipe do
         | 
| 474 | 
            +
                            chef_mirror '' do
         | 
| 475 | 
            +
                              versioned_cookbooks false
         | 
| 476 | 
            +
                              action :download
         | 
| 477 | 
            +
                            end
         | 
| 478 | 
            +
                          end
         | 
| 479 | 
            +
                          expect(chef_run).to have_updated('chef_mirror[]', :download)
         | 
| 480 | 
            +
                          expect(File.read(path_to('cookbooks/x/metadata.rb'))).to eq('name "x"; version "2.0.0"')
         | 
| 481 | 
            +
                        end
         | 
| 482 | 
            +
             | 
| 483 | 
            +
                        context 'and Chef::Config.chef_repo_path is set elsewhere' do
         | 
| 484 | 
            +
                          before do
         | 
| 485 | 
            +
                            Chef::Config.chef_repo_path = '/x/y/z'
         | 
| 486 | 
            +
                          end
         | 
| 487 | 
            +
             | 
| 488 | 
            +
                          it 'chef_mirror :download with chef_repo_path downloads all versions of the cookbook' do
         | 
| 489 | 
            +
                            repository_dir = @repository_dir
         | 
| 490 | 
            +
                            run_recipe do
         | 
| 491 | 
            +
                              chef_mirror '' do
         | 
| 492 | 
            +
                                chef_repo_path repository_dir
         | 
| 493 | 
            +
                                action :download
         | 
| 494 | 
            +
                              end
         | 
| 495 | 
            +
                            end
         | 
| 496 | 
            +
                            expect(chef_run).to have_updated('chef_mirror[]', :download)
         | 
| 497 | 
            +
                            expect(File.read(path_to('cookbooks/x-1.0.0/metadata.rb'))).to eq('name "x"; version "1.0.0"')
         | 
| 498 | 
            +
                            expect(File.read(path_to('cookbooks/x-2.0.0/metadata.rb'))).to eq('name "x"; version "2.0.0"')
         | 
| 499 | 
            +
                          end
         | 
| 500 | 
            +
             | 
| 501 | 
            +
                          it 'chef_mirror :download with chef_repo_path and versioned_cookbooks = false downloads the latest version of the cookbook' do
         | 
| 502 | 
            +
                            repository_dir = @repository_dir
         | 
| 503 | 
            +
                            run_recipe do
         | 
| 504 | 
            +
                              chef_mirror '' do
         | 
| 505 | 
            +
                                chef_repo_path repository_dir
         | 
| 506 | 
            +
                                versioned_cookbooks false
         | 
| 507 | 
            +
                                action :download
         | 
| 508 | 
            +
                              end
         | 
| 509 | 
            +
                            end
         | 
| 510 | 
            +
                            expect(chef_run).to have_updated('chef_mirror[]', :download)
         | 
| 511 | 
            +
                            expect(File.read(path_to('cookbooks/x/metadata.rb'))).to eq('name "x"; version "2.0.0"')
         | 
| 512 | 
            +
                          end
         | 
| 513 | 
            +
                        end
         | 
| 514 | 
            +
                      end
         | 
| 515 | 
            +
                    end
         | 
| 516 | 
            +
                  end
         | 
| 517 | 
            +
                end
         | 
| 243 518 | 
             
              end
         | 
| 244 519 | 
             
            end
         | 
| @@ -5,7 +5,7 @@ require 'chef/provider/chef_node' | |
| 5 5 | 
             
            describe Chef::Resource::ChefNode do
         | 
| 6 6 | 
             
              extend SpecSupport
         | 
| 7 7 |  | 
| 8 | 
            -
               | 
| 8 | 
            +
              when_the_chef_12_server 'is in multi-org mode' do
         | 
| 9 9 | 
             
                organization 'foo'
         | 
| 10 10 |  | 
| 11 11 | 
             
                before :each do
         | 
| @@ -129,6 +129,34 @@ describe Chef::Resource::ChefNode do | |
| 129 129 | 
             
                    end
         | 
| 130 130 | 
             
                  end
         | 
| 131 131 |  | 
| 132 | 
            +
                  context 'with chef_node "blah" and an updated normal attribute value' do
         | 
| 133 | 
            +
                    with_converge do
         | 
| 134 | 
            +
                      chef_node 'blah' do
         | 
| 135 | 
            +
                        attributes 'foo' => 'fum'
         | 
| 136 | 
            +
                      end
         | 
| 137 | 
            +
                    end
         | 
| 138 | 
            +
             | 
| 139 | 
            +
                    it 'new normal attribute is added' do
         | 
| 140 | 
            +
                      expect(chef_run).to have_updated 'chef_node[blah]', :create
         | 
| 141 | 
            +
                      node = get('nodes/blah')
         | 
| 142 | 
            +
                      expect(node['normal']).to eq({ 'foo' => 'fum', 'tags' => [ 'a', 'b' ] })
         | 
| 143 | 
            +
                    end
         | 
| 144 | 
            +
                  end
         | 
| 145 | 
            +
             | 
| 146 | 
            +
                  context 'with chef_node "blah" and a new normal attribute' do
         | 
| 147 | 
            +
                    with_converge do
         | 
| 148 | 
            +
                      chef_node 'blah' do
         | 
| 149 | 
            +
                        attributes 'foe' => 'fum'
         | 
| 150 | 
            +
                      end
         | 
| 151 | 
            +
                    end
         | 
| 152 | 
            +
             | 
| 153 | 
            +
                    it 'new normal attribute is added' do
         | 
| 154 | 
            +
                      expect(chef_run).to have_updated 'chef_node[blah]', :create
         | 
| 155 | 
            +
                      node = get('nodes/blah')
         | 
| 156 | 
            +
                      expect(node['normal']).to eq({ 'foe' => 'fum', 'foo' => 'bar', 'tags' => [ 'a', 'b' ] })
         | 
| 157 | 
            +
                    end
         | 
| 158 | 
            +
                  end
         | 
| 159 | 
            +
             | 
| 132 160 | 
             
                  context 'with chef_node "blah" with complete true' do
         | 
| 133 161 | 
             
                    with_converge do
         | 
| 134 162 | 
             
                      chef_node 'blah' do
         | 
| @@ -147,6 +175,22 @@ describe Chef::Resource::ChefNode do | |
| 147 175 | 
             
                      expect(node['override']).to eq({ 'foo4' => 'bar4' })
         | 
| 148 176 | 
             
                    end
         | 
| 149 177 | 
             
                  end
         | 
| 178 | 
            +
             | 
| 179 | 
            +
                  context 'with chef_node "blah", complete true and a new normal attribute' do
         | 
| 180 | 
            +
                    with_converge do
         | 
| 181 | 
            +
                      chef_node 'blah' do
         | 
| 182 | 
            +
                        attributes 'foe' => 'fum'
         | 
| 183 | 
            +
                        complete true
         | 
| 184 | 
            +
                      end
         | 
| 185 | 
            +
                    end
         | 
| 186 | 
            +
             | 
| 187 | 
            +
                    it 'normal foo attribute is replaced with new attribute' do
         | 
| 188 | 
            +
                      expect(chef_run).to have_updated 'chef_node[blah]', :create
         | 
| 189 | 
            +
                      node = get('nodes/blah')
         | 
| 190 | 
            +
                      expect(node['normal']).to eq({ 'foe' => 'fum', 'tags' => [ 'a', 'b' ] })
         | 
| 191 | 
            +
                    end
         | 
| 192 | 
            +
                  end
         | 
| 193 | 
            +
             | 
| 150 194 | 
             
                end
         | 
| 151 195 | 
             
              end
         | 
| 152 196 |  | 
| @@ -5,7 +5,7 @@ require 'chef/provider/chef_organization' | |
| 5 5 | 
             
            describe Chef::Resource::ChefOrganization do
         | 
| 6 6 | 
             
              extend SpecSupport
         | 
| 7 7 |  | 
| 8 | 
            -
               | 
| 8 | 
            +
              when_the_chef_12_server 'is in multi-org mode' do
         | 
| 9 9 | 
             
                context 'and chef_server_url is pointed at the top level' do
         | 
| 10 10 | 
             
                  user 'u', {}
         | 
| 11 11 | 
             
                  user 'u2', {}
         | 
| @@ -44,7 +44,7 @@ describe Chef::Resource::ChefUser do | |
| 44 44 | 
             
                end
         | 
| 45 45 | 
             
              end
         | 
| 46 46 |  | 
| 47 | 
            -
               | 
| 47 | 
            +
              when_the_chef_12_server 'is in multi-org mode' do
         | 
| 48 48 | 
             
                context 'and chef_server_url is pointed at the top level' do
         | 
| 49 49 | 
             
                  context 'and we run a recipe that creates user "blah"'do
         | 
| 50 50 | 
             
                    with_converge do
         | 
| @@ -9,6 +9,12 @@ require 'support/repository_support' | |
| 9 9 | 
             
            module SpecSupport
         | 
| 10 10 | 
             
              include ChefZero::RSpec
         | 
| 11 11 |  | 
| 12 | 
            +
              def when_the_chef_12_server(*args, &block)
         | 
| 13 | 
            +
                if Gem::Version.new(ChefZero::VERSION) >= Gem::Version.new('3.1')
         | 
| 14 | 
            +
                  when_the_chef_server(*args, :osc_compat => false, :single_org => false, &block)
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
             | 
| 12 18 | 
             
              def self.extended(klass)
         | 
| 13 19 | 
             
                klass.class_eval do
         | 
| 14 20 | 
             
                  extend RepositorySupport
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: cheffish
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version:  | 
| 4 | 
            +
              version: 0.8.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - John Keiser
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2014-09- | 
| 11 | 
            +
            date: 2014-09-08 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: chef
         |