Skip to content

Command line too long when Busser is trying to upload test files to the guest #11

@jhosm

Description

@jhosm

Hi,

I'm using ServerSpec with Test Kitchen to validate Windows platforms, altough I believe the problem is with busser and not with ServerSpec.

When my spec files pass a given threshold in size, I get the following error:

D      ---Nested Exception---
D      Class: Kitchen::Transport::TransportFailed
D      Message: Transport WinRM exited (1) using shell [powershell] for command: [$env:BUSSER_ROOT="/tmp/busser"; $env:G
EM_HOME="/tmp/busser/gems"; $env:GEM_PATH="/tmp/busser/gems"; $env:PATH="$env:PATH;$env:GEM_PATH/bin"; try { $env:BUSSER
_SUITE_PATH=@(busser suite path) } catch { $env:BUSSER_SUITE_PATH="" }; $env:GEM_CACHE="/tmp/busser/gems/cache"

busser suite cleanup

echo "Uploading $env:BUSSER_SUITE_PATH/serverspec/default_spec.rb (mode=0644)"
echo "<a big BASE64 string>" | busser deserialize --d
estination=$env:BUSSER_SUITE_PATH/serverspec/default_spec.rb --md5sum=ae128f6996f939cab5d3b3129919bf5f --perms=0644

echo "Uploading $env:BUSSER_SUITE_PATH/serverspec/event_logs_spec.rb (mode=0644)"
echo "<another big BASE64 string>" | bu
sser deserialize --destination=$env:BUSSER_SUITE_PATH/serverspec/event_logs_spec.rb --md5sum=e5bd4859e688b7581c07f97bdbe
b709c --perms=0644

echo "Uploading $env:BUSSER_SUITE_PATH/serverspec/windows_features_spec.rb (mode=0644)"
echo "<yet another big BASE64 string>" | busser deserialize --destination=$env:BUSSER_SUITE_PATH/serverspec/windows_features_spec.rb --md5sum=dc7f436ca8091
fb632d443e7548cf428 --perms=0644

]
REMOTE ERROR:
The command line is too long.

D      ------Backtrace-------
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/transport/winrm.rb:54:in `execute'
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/driver/base.rb:95:in `block in verify'
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/transport/base.rb:73:in `connection'
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/driver/base.rb:94:in `verify'
D      C:/opscode/chefdk/embedded/lib/ruby/gems/2.0.0/gems/kitchen-vagrant-0.15.0/lib/kitchen/driver/vagrant.rb:92:in `v
erify'
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/instance.rb:373:in `public_send'
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/instance.rb:373:in `block in perform_action'
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/instance.rb:437:in `call'
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/instance.rb:437:in `synchronize_or_call'
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/instance.rb:402:in `block in action'
D      C:/opscode/chefdk/embedded/lib/ruby/2.0.0/benchmark.rb:281:in `measure'
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/instance.rb:401:in `action'
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/instance.rb:373:in `perform_action'
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/instance.rb:351:in `verify_action'
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/instance.rb:313:in `block in transition_to'
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/instance.rb:312:in `each'
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/instance.rb:312:in `transition_to'
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/instance.rb:160:in `verify'
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/command.rb:176:in `public_send'
D      C:/opscode/chefdk/embedded/apps/test-kitchen/lib/kitchen/command.rb:176:in `block (2 levels) in run_action'
D      C:/Users/jhm/.chefdk/gem/ruby/2.0.0/gems/logging-1.8.2/lib/logging/diagnostic_context.rb:323:in `call'
D      C:/Users/jhm/.chefdk/gem/ruby/2.0.0/gems/logging-1.8.2/lib/logging/diagnostic_context.rb:323:in `block in create_
with_logging_context'

I've digged into it and I believe that the issue is we're telling powershell to execute a command that hits some ceiling.

I made a quick hack on \test-kitchen\lib\kitchen\busser.rb:

  def sync_cmd
      return if local_suite_files.empty?

      cmd = <<-CMD.gsub(/^ {8}/, "")
        #{busser_setup_env}

        #{sudo(config[:busser_bin])} suite cleanup

      CMD

      #if shell == "bourne"
        local_suite_files.each do |f|
          cmd << stream_file(f, remote_file(f, config[:suite_name])).concat("\n")
        end
        helper_files.each do |f|
          cmd << stream_file(f, remote_file(f, "helpers")).concat("\n")
        end
      #end

      Util.wrap_command(cmd, shell)
    end

    def sync_files
      if shell == "powershell"
        suite_files = { local: local_suite_files + helper_files, remote: 'C:\tmp\busser\suites\serverspec' }
        [suite_files]
      else
        []
      end
    end

and \test-kitchen\lib\kitchen\driver\base.rb:

def verify(state)
  transport.connection(state) do |conn|
    conn.execute(busser.sync_cmd)
    files_to_upload = busser.sync_files
    files_to_upload.each do |files|
      conn.upload!(files[:local], files[:remote])
    end
    conn.execute(busser.run_cmd)
  end
end

and the problem when away. This is obviously not the correct solution but I do not know what would the best solution be.

Cheers,
João

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions