Merge branch 'master' into 12033-multisite-search
authorTom Clegg <tclegg@veritasgenetics.com>
Thu, 17 Aug 2017 17:18:41 +0000 (13:18 -0400)
committerTom Clegg <tclegg@veritasgenetics.com>
Thu, 17 Aug 2017 17:18:41 +0000 (13:18 -0400)
refs #12033

Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

1  2 
apps/workbench/app/controllers/collections_controller.rb
build/run-build-packages.sh
build/run-tests.sh

index da7b4666a03c753f8f4876753ac585e446fb33ad,5fcb2dc569ff6b2446c602dc26de61a069155ba2..779d95c45b874d4fec157768e19013a1c68a0022
@@@ -16,7 -16,7 +16,7 @@@ class CollectionsController < Applicati
    skip_around_filter(:require_thread_api_token,
                       only: [:show_file, :show_file_links])
    skip_before_filter(:find_object_by_uuid,
 -                     only: [:provenance, :show_file, :show_file_links])
 +                     only: [:provenance, :show_file, :show_file_links, :multisite])
    # We depend on show_file to display the user agreement:
    skip_before_filter :check_user_agreements, only: :show_file
    skip_before_filter :check_user_profile, only: :show_file
    end
  
    def show_file_links
-     if Rails.configuration.keep_web_url || Rails.configuration.keep_web_download_url
-       # show_file will redirect to keep-web's directory listing
-       return show_file
-     end
-     Thread.current[:reader_tokens] = [params[:reader_token]]
-     return if false.equal?(find_object_by_uuid)
-     render layout: false
+     return show_file
    end
  
    def show_file
-     # We pipe from arv-get to send the file to the user.  Before we start it,
-     # we ask the API server if the file actually exists.  This serves two
-     # purposes: it lets us return a useful status code for common errors, and
-     # helps us figure out which token to provide to arv-get.
      # The order of searched tokens is important: because the anonymous user
      # token is passed along with every API request, we have to check it first.
      # Otherwise, it's impossible to know whether any other request succeeded
        return
      end
  
-     # If we are configured to use a keep-web server, just redirect to
-     # the appropriate URL.
-     if Rails.configuration.keep_web_url or
-         Rails.configuration.keep_web_download_url
-       opts = {}
-       if usable_token == params[:reader_token]
-         opts[:path_token] = usable_token
-       elsif usable_token == Rails.configuration.anonymous_user_token
-         # Don't pass a token at all
-       else
-         # We pass the current user's real token only if it's necessary
-         # to read the collection.
-         opts[:query_token] = usable_token
-       end
-       opts[:disposition] = params[:disposition] if params[:disposition]
-       return redirect_to keep_web_url(params[:uuid], params[:file], opts)
-     end
-     # No keep-web server available. Get the file data with arv-get,
-     # and serve it through Rails.
-     file_name = params[:file].andand.sub(/^(\.\/|\/|)/, './')
-     if file_name.nil? or not coll.manifest.has_file?(file_name)
-       return render_not_found
-     end
-     opts = params.merge(arvados_api_token: usable_token)
-     # Handle Range requests. Currently we support only 'bytes=0-....'
-     if request.headers.include? 'HTTP_RANGE'
-       if m = /^bytes=0-(\d+)/.match(request.headers['HTTP_RANGE'])
-         opts[:maxbytes] = m[1]
-         size = params[:size] || '*'
-         self.response.status = 206
-         self.response.headers['Content-Range'] = "bytes 0-#{m[1]}/#{size}"
-       end
-     end
-     ext = File.extname(params[:file])
-     self.response.headers['Content-Type'] =
-       Rack::Mime::MIME_TYPES[ext] || 'application/octet-stream'
-     if params[:size]
-       size = params[:size].to_i
-       if opts[:maxbytes]
-         size = [size, opts[:maxbytes].to_i].min
-       end
-       self.response.headers['Content-Length'] = size.to_s
-     end
-     self.response.headers['Content-Disposition'] = params[:disposition] if params[:disposition]
-     begin
-       file_enumerator(opts).each do |bytes|
-         response.stream.write bytes
-       end
-     ensure
-       response.stream.close
+     opts = {}
+     if usable_token == params[:reader_token]
+       opts[:path_token] = usable_token
+     elsif usable_token == Rails.configuration.anonymous_user_token
+       # Don't pass a token at all
+     else
+       # We pass the current user's real token only if it's necessary
+       # to read the collection.
+       opts[:query_token] = usable_token
      end
+     opts[:disposition] = params[:disposition] if params[:disposition]
+     return redirect_to keep_web_url(params[:uuid], params[:file], opts)
    end
  
    def sharing_scopes
  
    def download_link
      token = @search_sharing.first.api_token
-     if Rails.configuration.keep_web_url || Rails.configuration.keep_web_download_url
-       keep_web_url(@object.uuid, nil, {path_token: token})
-     else
-       collections_url + "/download/#{@object.uuid}/#{token}/"
-     end
+     keep_web_url(@object.uuid, nil, {path_token: token})
    end
  
    def share
  
      uri.to_s
    end
-   # Note: several controller and integration tests rely on stubbing
-   # file_enumerator to return fake file content.
-   def file_enumerator opts
-     FileStreamer.new opts
-   end
-   class FileStreamer
-     include ArvadosApiClientHelper
-     def initialize(opts={})
-       @opts = opts
-     end
-     def each
-       return unless @opts[:uuid] && @opts[:file]
-       env = Hash[ENV].dup
-       require 'uri'
-       u = URI.parse(arvados_api_client.arvados_v1_base)
-       env['ARVADOS_API_HOST'] = "#{u.host}:#{u.port}"
-       env['ARVADOS_API_TOKEN'] = @opts[:arvados_api_token]
-       env['ARVADOS_API_HOST_INSECURE'] = "true" if Rails.configuration.arvados_insecure_https
-       bytesleft = @opts[:maxbytes].andand.to_i || 2**16
-       io = IO.popen([env, 'arv-get', "#{@opts[:uuid]}/#{@opts[:file]}"], 'rb')
-       while bytesleft > 0 && (buf = io.read([bytesleft, 2**16].min)) != nil
-         # shrink the bytesleft count, if we were given a maximum byte
-         # count to read
-         if @opts.include? :maxbytes
-           bytesleft = bytesleft - buf.length
-         end
-         yield buf
-       end
-       io.close
-       # "If ios is opened by IO.popen, close sets $?."
-       # http://www.ruby-doc.org/core-2.1.3/IO.html#method-i-close
-       Rails.logger.warn("#{@opts[:uuid]}/#{@opts[:file]}: #{$?}") if $? != 0
-     end
-   end
  end
index af90eb6f2dabad701c4b211a4733aad73e1b58f5,2958d3323d9972f7cf826ef1fb0cb69c05d448eb..2cde946d494b566d1681f3c16fd851e5a9fb7fa5
@@@ -620,8 -620,8 +620,9 @@@ if [[ "$?" == "0" ]] ; the
        \cp config/application.yml.example config/application.yml -f
        \cp config/environments/production.rb.example config/environments/production.rb -f
        sed -i 's/secret_token: ~/secret_token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/' config/application.yml
+       sed -i 's/keep_web_url: false/keep_web_url: exampledotcom/' config/application.yml
  
 +      RAILS_ENV=production RAILS_GROUPS=assets bundle exec rake npm:install >/dev/null
        RAILS_ENV=production RAILS_GROUPS=assets bundle exec rake assets:precompile >/dev/null
  
        # Remove generated configuration files so they don't go in the package.
diff --combined build/run-tests.sh
index 15e89fa9273db020c5a7651b28ee22d049fbbcd4,20780811a58e5ecd59ce9c4b399f3b914c462480..70ea0ef073ba4a8d726ebce8565f1a4e659ab525
@@@ -81,7 -81,7 +81,7 @@@ services/keepstor
  services/keep-balance
  services/login-sync
  services/nodemanager
- services/nodemanager-integration
+ services/nodemanager_integration
  services/crunch-run
  services/crunch-dispatch-local
  services/crunch-dispatch-slurm
@@@ -204,8 -204,6 +204,8 @@@ sanity_checks() 
      echo -n 'gitolite: '
      which gitolite \
          || fatal "No gitolite. Try: apt-get install gitolite3"
 +    which npm \
 +          || fatal "No npm. Try: wget -O- https://nodejs.org/dist/v6.11.2/node-v6.11.2-linux-x64.tar.xz | sudo tar -C /usr/local xJf - && sudo ln -s ../node-v6.11.2-linux-x64/bin/{node,npm} /usr/local/bin/"
  }
  
  rotate_logfile() {
@@@ -547,6 -545,9 +547,9 @@@ do_test() 
          apps/workbench_units | apps/workbench_functionals | apps/workbench_integration)
              suite=apps/workbench
              ;;
+         services/nodemanager | services/nodemanager_integration)
+             suite=services/nodemanager_suite
+             ;;
          *)
              suite="${1}"
              ;;
@@@ -807,8 -808,7 +810,8 @@@ don
  install_workbench() {
      cd "$WORKSPACE/apps/workbench" \
          && mkdir -p tmp/cache \
 -        && RAILS_ENV=test bundle_install_trylocal
 +        && RAILS_ENV=test bundle_install_trylocal \
 +        && RAILS_ENV=test RAILS_GROUPS=assets bundle exec rake npm:install
  }
  do_install apps/workbench workbench
  
@@@ -863,11 -863,11 +866,11 @@@ test_login-sync() 
  }
  do_test services/login-sync login-sync
  
- test_nodemanager-integration() {
+ test_nodemanager_integration() {
      cd "$WORKSPACE/services/nodemanager" \
-         && tests/integration_test.py ${testargs[services/nodemanager-integration]}
+         && tests/integration_test.py ${testargs[services/nodemanager_integration]}
  }
- do_test services/nodemanager-integration nodemanager-integration
+ do_test services/nodemanager_integration nodemanager_integration
  
  for p in "${pythonstuff[@]}"
  do