X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/7d9cfb6e0716239f996bae054bc9345a663e0b7e..09a2e88c51e5432e607f2a38466e55b4ba15e887:/services/api/test/functional/arvados/v1/jobs_controller_test.rb diff --git a/services/api/test/functional/arvados/v1/jobs_controller_test.rb b/services/api/test/functional/arvados/v1/jobs_controller_test.rb index e648523323..8808a82c45 100644 --- a/services/api/test/functional/arvados/v1/jobs_controller_test.rb +++ b/services/api/test/functional/arvados/v1/jobs_controller_test.rb @@ -10,7 +10,7 @@ class Arvados::V1::JobsControllerTest < ActionController::TestCase post :create, job: { script: "hash", script_version: "master", - repository: "foo", + repository: "active/foo", script_parameters: {} } assert_response :success @@ -27,7 +27,7 @@ class Arvados::V1::JobsControllerTest < ActionController::TestCase script: "hash", script_version: "master", script_parameters: {}, - repository: "foo", + repository: "active/foo", started_at: Time.now, finished_at: Time.now, running: false, @@ -97,11 +97,42 @@ class Arvados::V1::JobsControllerTest < ActionController::TestCase 'server should correct bogus cancelled_at ' + job['cancelled_at']) assert_equal(true, - File.exists?(Rails.configuration.crunch_refresh_trigger), + File.exist?(Rails.configuration.crunch_refresh_trigger), 'trigger file should be created when job is cancelled') end - test "cancelling a cancelled jobs stays cancelled" do + [ + [:put, :update, {job:{cancelled_at: Time.now}}, :success], + [:put, :update, {job:{cancelled_at: nil}}, :unprocessable_entity], + [:put, :update, {job:{state: 'Cancelled'}}, :success], + [:put, :update, {job:{state: 'Queued'}}, :unprocessable_entity], + [:put, :update, {job:{state: 'Running'}}, :unprocessable_entity], + [:put, :update, {job:{state: 'Failed'}}, :unprocessable_entity], + [:put, :update, {job:{state: 'Complete'}}, :unprocessable_entity], + [:post, :cancel, {}, :success], + ].each do |http_method, action, params, expected_response| + test "cancelled job stays cancelled after #{[http_method, action, params].inspect}" do + # We need to verify that "cancel" creates a trigger file, so first + # let's make sure there is no stale trigger file. + begin + File.unlink(Rails.configuration.crunch_refresh_trigger) + rescue Errno::ENOENT + end + + authorize_with :active + self.send http_method, action, { id: jobs(:cancelled).uuid }.merge(params) + assert_response expected_response + if expected_response == :success + job = json_response + assert_not_nil job['cancelled_at'], 'job cancelled again using #{attribute}=#{value} did not have cancelled_at value' + assert_equal job['state'], 'Cancelled', 'cancelled again job state changed when updated using using #{attribute}=#{value}' + end + # Verify database record still says Cancelled + assert_equal 'Cancelled', Job.find(jobs(:cancelled).id).state, 'job was un-cancelled' + end + end + + test "cancelled job updated to any other state change results in error" do # We need to verify that "cancel" creates a trigger file, so first # let's make sure there is no stale trigger file. begin @@ -359,6 +390,135 @@ class Arvados::V1::JobsControllerTest < ActionController::TestCase test "job lock conflict" do authorize_with :active post :lock, {id: jobs(:running).uuid} - assert_response 403 # forbidden + assert_response 422 # invalid state transition + end + + test 'reject invalid commit in remote repository' do + authorize_with :active + url = "http://localhost:1/fake/fake.git" + fetch_remote_from_local_repo url, :foo + post :create, job: { + script: "hash", + script_version: "abc123", + repository: url, + script_parameters: {} + } + assert_response 422 + end + + test 'tag remote commit in internal repository' do + authorize_with :active + url = "http://localhost:1/fake/fake.git" + fetch_remote_from_local_repo url, :foo + post :create, job: { + script: "hash", + script_version: "master", + repository: url, + script_parameters: {} + } + assert_response :success + assert_equal('077ba2ad3ea24a929091a9e6ce545c93199b8e57', + internal_tag(json_response['uuid'])) + end + + test 'tag local commit in internal repository' do + authorize_with :active + post :create, job: { + script: "hash", + script_version: "master", + repository: "active/foo", + script_parameters: {} + } + assert_response :success + assert_equal('077ba2ad3ea24a929091a9e6ce545c93199b8e57', + internal_tag(json_response['uuid'])) + end + + test 'get job with components' do + authorize_with :active + get :show, {id: jobs(:running_job_with_components).uuid} + assert_response :success + assert_not_nil json_response["components"] + assert_equal ["component1", "component2"], json_response["components"].keys + end + + [ + [:active, :success], + [:system_user, :success], + [:admin, 403], + ].each do |user, expected| + test "add components to job locked by active user as #{user} user and expect #{expected}" do + authorize_with user + put :update, { + id: jobs(:running).uuid, + job: { + components: {"component1" => "value1", "component2" => "value2"} + } + } + assert_response expected + if expected == :success + assert_not_nil json_response["components"] + keys = json_response["components"].keys + assert_equal ["component1", "component2"], keys + assert_equal "value1", json_response["components"][keys[0]] + end + end + end + + test 'get_delete components_get again for job with components' do + authorize_with :active + get :show, {id: jobs(:running_job_with_components).uuid} + assert_response :success + assert_not_nil json_response["components"] + assert_equal ["component1", "component2"], json_response["components"].keys + + # delete second component + @test_counter = 0 # Reset executed action counter + @controller = Arvados::V1::JobsController.new + put :update, { + id: jobs(:running_job_with_components).uuid, + job: { + components: {"component1" => "zzzzz-8i9sb-jobuuid00000001"} + } + } + assert_response :success + + @test_counter = 0 # Reset executed action counter + @controller = Arvados::V1::JobsController.new + get :show, {id: jobs(:running_job_with_components).uuid} + assert_response :success + assert_not_nil json_response["components"] + assert_equal ["component1"], json_response["components"].keys + + # delete all components + @test_counter = 0 # Reset executed action counter + @controller = Arvados::V1::JobsController.new + put :update, { + id: jobs(:running_job_with_components).uuid, + job: { + components: {} + } + } + assert_response :success + + @test_counter = 0 # Reset executed action counter + @controller = Arvados::V1::JobsController.new + get :show, {id: jobs(:running_job_with_components).uuid} + assert_response :success + assert_not_nil json_response["components"] + assert_equal [], json_response["components"].keys + end + + test 'jobs.create disabled in config' do + Rails.configuration.disable_api_methods = ["jobs.create", + "pipeline_instances.create"] + authorize_with :active + post :create, job: { + script: "hash", + script_version: "master", + repository: "active/foo", + script_parameters: {} + } + assert_response 404 end end