If a Vagrantfile has more than one `:chef_client` provisioner, vagrant-berkshelf's upload action will upload the same Berksfile object for each provisioner.
https://github.com/RiotGames/vagrant-berkshelf/blob/master/lib/berkshelf/vagrant/action/upload.rb#L35

That means that it's going to get to Resolver#use_source via this stack:
* Resolver#use_source
* Resolver#add_source
* Resolver#initialize
* Berksfile#resolve
* Berksfile#install
* Berskfile#upload

So when it gets into use_source and the source is not downloaded and it's not git, and it finds a cached copy it sets source.cached_cookbook:

https://github.com/RiotGames/berkshelf/blob/2-0-stable/lib/berkshelf/resolver.rb#L180

but it does not set the source.location.

So the next call into the same stack this time downloaded is true. So goes into this code:
https://github.com/RiotGames/berkshelf/blob/2-0-stable/lib/berkshelf/resolver.rb#L164-168

and gets a no method defined validate_cached for nil because location is nil.

So the short answer is: location is nil for that source because nothing ever set it.