Commit 154b8ceb authored by Grzegorz Bizon's avatar Grzegorz Bizon

Refactor build artifacts upload API endpoint

parent 3f0c18f8
...@@ -289,12 +289,14 @@ module API ...@@ -289,12 +289,14 @@ module API
# file helpers # file helpers
def uploaded_file!(field, uploads_path) def uploaded_file(field, uploads_path)
if params[field] if params[field]
bad_request!("#{field} is not a file") unless params[field].respond_to?(:filename) bad_request!("#{field} is not a file") unless params[field].respond_to?(:filename)
return params[field] return params[field]
end end
return nil unless params["#{field}.path"] && params["#{field}.name"]
# sanitize file paths # sanitize file paths
# this requires all paths to exist # this requires all paths to exist
required_attributes! %W(#{field}.path) required_attributes! %W(#{field}.path)
......
...@@ -85,7 +85,6 @@ module Ci ...@@ -85,7 +85,6 @@ module Ci
# file.type - real content type as send in Content-Type # file.type - real content type as send in Content-Type
# metadata.path - path to locally stored body (generated by Workhorse) # metadata.path - path to locally stored body (generated by Workhorse)
# metadata.name - filename (generated by Workhorse) # metadata.name - filename (generated by Workhorse)
# metadata.type - content type (returned by Workhorse)
# Headers: # Headers:
# BUILD-TOKEN (required) - The build authorization token, the same as token # BUILD-TOKEN (required) - The build authorization token, the same as token
# Body: # Body:
...@@ -99,17 +98,17 @@ module Ci ...@@ -99,17 +98,17 @@ module Ci
build = Ci::Build.find_by_id(params[:id]) build = Ci::Build.find_by_id(params[:id])
not_found! unless build not_found! unless build
authenticate_build_token!(build) authenticate_build_token!(build)
forbidden!('build is not running') unless build.running? forbidden!('Build is not running!') unless build.running?
forbidden!('metadata reserved for workhorse') if params[:metadata]
artifacts_upload_path = ArtifactUploader.artifacts_upload_path artifacts_upload_path = ArtifactUploader.artifacts_upload_path
artifacts = uploaded_file!(:file, artifacts_upload_path) artifacts = uploaded_file(:file, artifacts_upload_path)
metadata = uploaded_file(:metadata, artifacts_upload_path)
bad_request!('Missing artifacts file!') unless artifacts
file_to_large! unless artifacts.size < max_artifacts_size file_to_large! unless artifacts.size < max_artifacts_size
build.artifacts_file = artifacts
if params[:'metadata.path'] && params[:'metadata.name'] build.artifacts_file = artifacts
build.artifacts_metadata = uploaded_file!(:metadata, artifacts_upload_path) build.artifacts_metadata = metadata
end
if build.save if build.save
present(build, with: Entities::Build) present(build, with: Entities::Build)
......
...@@ -240,17 +240,16 @@ describe Ci::API::API do ...@@ -240,17 +240,16 @@ describe Ci::API::API do
end end
end end
context 'runner sends metadata file' do context 'no artifacts file in post data' do
let(:post_data) do let(:post_data) do
{ 'file' => artifacts, 'metadata' => metadata } { 'metadata' => metadata }
end end
it 'is expected to respond with forbbiden' do it 'is expected to respond with bad request' do
expect(response.status).to eq(403) expect(response.status).to eq(400)
end end
it 'does not store artifacts or metadata' do it 'does not store metadata' do
expect(stored_artifacts_file).to be_nil
expect(stored_metadata_file).to be_nil expect(stored_metadata_file).to be_nil
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment