Merge "Fixing job execution creation with is_protected field"

This commit is contained in:
Jenkins 2015-10-31 14:42:21 +00:00 committed by Gerrit Code Review
commit ef2dbb0e83
5 changed files with 43 additions and 59 deletions

View File

@ -71,7 +71,8 @@ def job_executions_cancel(job_execution_id):
@rest.patch('/job-executions/<job_execution_id>')
@acl.enforce("data-processing:job-executions:modify")
@v.check_exists(api.get_job_execution, id='job_execution_id')
@v.validate(v_j_e_schema.JOB_EXEC_UPDATE_SCHEMA)
@v.validate(
v_j_e_schema.JOB_EXEC_UPDATE_SCHEMA, v_j_e.check_job_execution_update)
def job_executions_update(job_execution_id, data):
return u.to_wrapped_dict(api.update_job_execution, job_execution_id, data)

View File

@ -842,11 +842,6 @@ def job_execution_update(context, job_execution_id, values):
raise ex.NotFoundException(job_execution_id,
_("JobExecution id '%s' not found!"))
# Skip this check for periodic tasks
if context.tenant_id:
validate.check_tenant_for_update(context, job_ex)
validate.check_protected_from_update(job_ex, values)
job_ex.update(values)
session.add(job_ex)

View File

@ -108,3 +108,11 @@ def check_job_execution_delete(job_execution_id, **kwargs):
acl.check_tenant_for_delete(ctx, je)
acl.check_protected_from_delete(je)
def check_job_execution_update(job_execution_id, data, **kwargs):
ctx = context.current()
je = conductor.job_execution_get(ctx, job_execution_id)
acl.check_tenant_for_update(ctx, je)
acl.check_protected_from_update(je, data)

View File

@ -532,59 +532,6 @@ class JobExecutionTest(test_base.ConductorManagerTestCase):
lst = self.api.job_execution_get_all(ctx, **kwargs)
self.assertEqual(0, len(lst))
def test_je_update_when_protected(self):
ctx = context.ctx()
job = self.api.job_create(ctx, SAMPLE_JOB)
ds_input = self.api.data_source_create(ctx, SAMPLE_DATA_SOURCE)
SAMPLE_DATA_OUTPUT = copy.deepcopy(SAMPLE_DATA_SOURCE)
SAMPLE_DATA_OUTPUT['name'] = 'output'
ds_output = self.api.data_source_create(ctx, SAMPLE_DATA_OUTPUT)
sample = copy.deepcopy(SAMPLE_JOB_EXECUTION)
sample['is_protected'] = True
sample['job_id'] = job['id']
sample['input_id'] = ds_input['id']
sample['output_id'] = ds_output['id']
je = self.api.job_execution_create(ctx, sample)
je_id = je["id"]
with testtools.ExpectedException(ex.UpdateFailedException):
try:
self.api.job_execution_update(ctx, je_id, {"is_public": True})
except ex.UpdateFailedException as e:
self.assert_protected_resource_exception(e)
raise e
self.api.job_execution_update(ctx, je_id, {"is_protected": False,
"is_public": True})
def test_public_je_update_from_another_tenant(self):
ctx = context.ctx()
job = self.api.job_create(ctx, SAMPLE_JOB)
ds_input = self.api.data_source_create(ctx, SAMPLE_DATA_SOURCE)
SAMPLE_DATA_OUTPUT = copy.deepcopy(SAMPLE_DATA_SOURCE)
SAMPLE_DATA_OUTPUT['name'] = 'output'
ds_output = self.api.data_source_create(ctx, SAMPLE_DATA_OUTPUT)
sample = copy.deepcopy(SAMPLE_JOB_EXECUTION)
sample['is_public'] = True
sample['job_id'] = job['id']
sample['input_id'] = ds_input['id']
sample['output_id'] = ds_output['id']
je = self.api.job_execution_create(ctx, sample)
je_id = je["id"]
ctx.tenant_id = 'tenant_2'
with testtools.ExpectedException(ex.UpdateFailedException):
try:
self.api.job_execution_update(ctx, je_id, {"is_public": True})
except ex.UpdateFailedException as e:
self.assert_created_in_another_tenant_exception(e)
raise e
class JobTest(test_base.ConductorManagerTestCase):
def __init__(self, *args, **kwargs):

View File

@ -277,6 +277,39 @@ class TestJobExecUpdateValidation(u.ValidationTestCase):
}
)
@mock.patch('sahara.conductor.api.LocalApi.job_execution_get')
def test_je_update_when_protected(self, get_je_p):
job_exec = mock.Mock(id='123', tenant_id='tenant_1', is_protected=True)
get_je_p.return_value = job_exec
# job execution can't be updated if it's marked as protected
with testtools.ExpectedException(ex.UpdateFailedException):
try:
je.check_job_execution_update(job_exec, {'is_public': True})
except ex.UpdateFailedException as e:
self.assert_protected_resource_exception(e)
raise e
# job execution can be updated because is_protected flag was
# set to False
je.check_job_execution_update(
job_exec, {'is_protected': False, 'is_public': True})
@mock.patch('sahara.conductor.api.LocalApi.job_execution_get')
def test_public_je_cancel_delete_from_another_tenant(self, get_je_p):
job_exec = mock.Mock(id='123', tenant_id='tenant2', is_protected=False,
is_public=True)
get_je_p.return_value = job_exec
with testtools.ExpectedException(ex.UpdateFailedException):
try:
je.check_job_execution_update(
job_exec, data={'is_public': False})
except ex.UpdateFailedException as e:
self.assert_created_in_another_tenant_exception(e)
raise e
class TestJobExecutionCancelDeleteValidation(u.ValidationTestCase):
def setUp(self):