hashicorp/vagrant · error · VagrantPlugins::AtlasPush::Errors::UploaderNotFound

Vagrant was unable to find the Atlas uploader CLI. If your V

Error message

Vagrant was unable to find the Atlas uploader CLI. If your Vagrantfile
specifies the path explicitly with "uploader_path", then make sure that
path is valid. Otherwise, make sure that you have a valid install of
Vagrant. If you installed Vagrant outside of the official installers,
the "atlas-upload" binary must exist on your PATH.

What it means

The atlas push strategy requires the atlas-upload CLI. Push#push resolves it via uploader_path: config.uploader_path if set, else the installer's embedded bin/atlas-upload, else Which on PATH — and raises Errors::UploaderNotFound when nothing resolves. The push cannot transfer anything without that executable.

Source

Thrown at plugins/pushes/atlas/push.rb:17

# Copyright IBM Corp. 2010, 2025
# SPDX-License-Identifier: BUSL-1.1

require "vagrant/util/safe_exec"
require "vagrant/util/subprocess"
require "vagrant/util/which"

module VagrantPlugins
  module AtlasPush
    class Push < Vagrant.plugin("2", :push)
      UPLOADER_BIN = "atlas-upload".freeze

      def push
        uploader = self.uploader_path

        # If we didn't find the uploader binary it is a critical error
        raise Errors::UploaderNotFound if !uploader

        # We found it. Build up the command and the args.
        execute(uploader)
        return 0
      end

      # Executes the uploader with the proper flags based on the configuration.
      # This function shouldn't return since it will exec, but might return
      # if we're on a system that doesn't support exec, so handle that properly.
      def execute(uploader)
        cmd = []
        cmd << "-debug" if !Vagrant.log_level.nil?
        cmd << "-vcs" if config.vcs
        cmd += config.includes.map { |v| ["-include", v] }
        cmd += config.excludes.map { |v| ["-exclude", v] }
        cmd += metadata.map { |k,v| ["-metadata", "#{k}=#{v}"] }
        cmd += ["-address", config.address] if config.address
        cmd += ["-token", config.token] if config.token

View on GitHub (pinned to 35f3160f4a)

Solutions

  1. Migrate off the atlas strategy — Atlas is deprecated/shut down; use heroku/local/ftp push or your normal deploy pipeline
  2. If you must use it, set uploader_path in the push block to a working atlas-upload binary's absolute path
  3. Confirm resolution with `which atlas-upload` on the host
  4. For non-official installs, place atlas-upload on the PATH Vagrant inherits

Example fix

# before
config.push.define "atlas" do |p|
  p.app = "mycorp/myapp"   # no uploader anywhere -> UploaderNotFound
end

# after
config.push.define "heroku" do |p|
  p.app = "mycorp-myapp"
end
Defensive patterns

Strategy: validation

Validate before calling

# wrapper check before `vagrant push`
abort "atlas-upload not found" if Vagrant::Util::Which.which("atlas-upload").nil?

Type guard

def atlas_push_ready?(config)
  path = config.uploader_path || Vagrant::Util::Which.which("atlas-upload")
  !path.nil? && File.executable?(path)
end

Try / catch

begin
  env.cli(%w(push atlas))
rescue VagrantPlugins::AtlasPush::Errors::UploaderNotFound
  abort "Set uploader_path in the push block or install atlas-upload"
end

Prevention

When it happens

Trigger: vagrant push with strategy atlas when config.uploader_path is unset/invalid AND the binary is neither in the installer's embedded dir nor on PATH — typical for gem/zip installs of Vagrant or modern installs that no longer bundle atlas-upload.

Common situations: Legacy Vagrantfiles from the Atlas era (pre-2017) still carrying a config.push.define "atlas" block; Vagrant installed via package managers; uploader_path pointing at a moved/deleted file; Atlas/Vagrant Cloud deprecation removing the binary.

Related errors


AI-assisted analysis of hashicorp/vagrant@35f3160f4a (2026-08-21). Data as JSON: /api/errors/c013b98d6874da38. Report an issue: GitHub.