X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/0df5f0feeced5bff0adfb806dae2d3811257827f..f25b37a8e72716478e7cfae11ab5bf13b7051694:/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 fb81f23636..9298f23d54 100644 --- a/services/api/test/functional/arvados/v1/jobs_controller_test.rb +++ b/services/api/test/functional/arvados/v1/jobs_controller_test.rb @@ -7,172 +7,6 @@ require 'helpers/git_test_helper' class Arvados::V1::JobsControllerTest < ActionController::TestCase - include GitTestHelper - - test "submit a job" do - authorize_with :active - post :create, params: { - job: { - script: "hash", - script_version: "master", - repository: "active/foo", - script_parameters: {} - } - } - assert_response :success - assert_not_nil assigns(:object) - new_job = JSON.parse(@response.body) - assert_not_nil new_job['uuid'] - assert_not_nil new_job['script_version'].match(/^[0-9a-f]{40}$/) - assert_equal 0, new_job['priority'] - end - - test "normalize output and log uuids when creating job" do - authorize_with :active - post :create, params: { - job: { - script: "hash", - script_version: "master", - script_parameters: {}, - repository: "active/foo", - started_at: Time.now, - finished_at: Time.now, - running: false, - success: true, - output: 'd41d8cd98f00b204e9800998ecf8427e+0+K@xyzzy', - log: 'd41d8cd98f00b204e9800998ecf8427e+0+K@xyzzy' - } - } - assert_response :success - assert_not_nil assigns(:object) - new_job = assigns(:object) - assert_equal 'd41d8cd98f00b204e9800998ecf8427e+0', new_job['log'] - assert_equal 'd41d8cd98f00b204e9800998ecf8427e+0', new_job['output'] - version = new_job['script_version'] - - # Make sure version doesn't get mangled by normalize - assert_not_nil version.match(/^[0-9a-f]{40}$/) - assert_equal 'master', json_response['supplied_script_version'] - end - - test "normalize output and log uuids when updating job" do - authorize_with :active - - foobar_job = jobs(:foobar) - - new_output = 'd41d8cd98f00b204e9800998ecf8427e+0+K@xyzzy' - new_log = 'd41d8cd98f00b204e9800998ecf8427e+0+K@xyzzy' - put :update, params: { - id: foobar_job['uuid'], - job: { - output: new_output, - log: new_log - } - } - - updated_job = json_response - assert_not_equal foobar_job['log'], updated_job['log'] - assert_not_equal new_log, updated_job['log'] # normalized during update - assert_equal new_log[0,new_log.rindex('+')], updated_job['log'] - assert_not_equal foobar_job['output'], updated_job['output'] - assert_not_equal new_output, updated_job['output'] # normalized during update - assert_equal new_output[0,new_output.rindex('+')], updated_job['output'] - end - - test "cancel a running job" 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 - put :update, params: { - id: jobs(:running).uuid, - job: { - cancelled_at: 4.day.ago - } - } - assert_response :success - assert_not_nil assigns(:object) - job = JSON.parse(@response.body) - assert_not_nil job['uuid'] - assert_not_nil job['cancelled_at'] - assert_not_nil job['cancelled_by_user_uuid'] - assert_not_nil job['cancelled_by_client_uuid'] - assert_equal(true, Time.parse(job['cancelled_at']) > 1.minute.ago, - 'server should correct bogus cancelled_at ' + - job['cancelled_at']) - assert_equal(true, - File.exist?(Rails.configuration.crunch_refresh_trigger), - 'trigger file should be created when job is cancelled') - end - - [ - [: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, params: { 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 - File.unlink(Rails.configuration.crunch_refresh_trigger) - rescue Errno::ENOENT - end - - authorize_with :active - put :update, params: { - id: jobs(:running_cancelled).uuid, - job: { - cancelled_at: nil - } - } - assert_response 422 - end - - ['abc.py', 'hash.py'].each do |script| - test "update job script attribute to #{script} without failing script_version check" do - authorize_with :admin - put :update, params: { - id: jobs(:uses_nonexistent_script_version).uuid, - job: { - script: script - } - } - assert_response :success - resp = assigns(:object) - assert_equal jobs(:uses_nonexistent_script_version).script_version, resp['script_version'] - end - end - test "search jobs by uuid with >= query" do authorize_with :active get :index, params: { @@ -331,52 +165,12 @@ class Arvados::V1::JobsControllerTest < ActionController::TestCase assert_response 422 end - test "finish a job" do - authorize_with :active - put :update, params: { - id: jobs(:nearly_finished_job).uuid, - job: { - output: '551392cc37a317abf865b95f66f4ef94+101', - log: '9215de2a951a721f5f156bc08cf63ad7+93', - tasks_summary: {done: 1, running: 0, todo: 0, failed: 0}, - success: true, - running: false, - finished_at: Time.now.to_s - } - } - assert_response :success - end - [:spectator, :admin].each_with_index do |which_token, i| test "get job queue as #{which_token} user" do authorize_with which_token get :queue assert_response :success - assert_equal i, assigns(:objects).count - end - end - - test "get job queue as with a = filter" do - authorize_with :admin - get :queue, params: { filters: [['script','=','foo']] } - assert_response :success - assert_equal ['foo'], assigns(:objects).collect(&:script).uniq - assert_equal 0, assigns(:objects)[0].queue_position - end - - test "get job queue as with a != filter" do - authorize_with :admin - get :queue, params: { filters: [['script','!=','foo']] } - assert_response :success - assert_equal 0, assigns(:objects).count - end - - [:spectator, :admin].each do |which_token| - test "get queue_size as #{which_token} user" do - authorize_with which_token - get :queue_size - assert_response :success - assert_equal 1, JSON.parse(@response.body)["queue_size"] + assert_equal 0, assigns(:objects).count end end @@ -387,67 +181,6 @@ class Arvados::V1::JobsControllerTest < ActionController::TestCase assert_equal([nodes(:busy).uuid], json_response["node_uuids"]) end - test "job lock success" do - authorize_with :active - post :lock, params: {id: jobs(:queued).uuid} - assert_response :success - job = Job.where(uuid: jobs(:queued).uuid).first - assert_equal "Running", job.state - end - - test "job lock conflict" do - authorize_with :active - post :lock, params: {id: jobs(:running).uuid} - 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, params: { - 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, params: { - 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, params: { - 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, params: {id: jobs(:running_job_with_components).uuid} @@ -455,42 +188,4 @@ class Arvados::V1::JobsControllerTest < ActionController::TestCase 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, params: { - 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 'jobs.create disabled in config' do - Rails.configuration.disable_api_methods = ["jobs.create", - "pipeline_instances.create"] - authorize_with :active - post :create, params: { - job: { - script: "hash", - script_version: "master", - repository: "active/foo", - script_parameters: {} - } - } - assert_response 404 - end end