Delete Job API
Adds the ability to delete jobs from the iDRAC job queue. Change-Id: I0e34cc850b968533782af45ef6e61206a3f04949 Co-Authored-By: Richard G. Pioso <richard.pioso@dell.com>
This commit is contained in:
parent
e68dacb1d6
commit
96fa6965db
|
@ -339,6 +339,27 @@ class DRACClient(object):
|
||||||
"""
|
"""
|
||||||
return self._job_mgmt.get_job(job_id)
|
return self._job_mgmt.get_job(job_id)
|
||||||
|
|
||||||
|
def delete_jobs(self, job_ids=['JID_CLEARALL']):
|
||||||
|
"""Deletes the given jobs, or all jobs if none specified
|
||||||
|
|
||||||
|
:param job_ids: a list of job ids to delete. Clearing all the
|
||||||
|
jobs may be accomplished using the keyword JID_CLEARALL
|
||||||
|
as the job_id, or JID_CLEARALL_FORCE if a job is in
|
||||||
|
Scheduled state and there is another job for the same
|
||||||
|
component in Completed or Failed state,
|
||||||
|
(http://en.community.dell.com/techcenter/extras/m/white_papers/20444501/download)
|
||||||
|
Deletion of each job id will be attempted, even if there
|
||||||
|
are errors in deleting any in the list.
|
||||||
|
:raises: WSManRequestFailure on request failures
|
||||||
|
:raises: WSManInvalidResponse when receiving invalid response
|
||||||
|
:raises: DRACOperationFailed on error reported back by the iDRAC
|
||||||
|
interface. There will be one message for each job_id
|
||||||
|
that had a failure in the exception.
|
||||||
|
:raises: DRACUnexpectedReturnValue on non-success
|
||||||
|
"""
|
||||||
|
|
||||||
|
return self._job_mgmt.delete_jobs(job_ids)
|
||||||
|
|
||||||
def create_config_job(self,
|
def create_config_job(self,
|
||||||
resource_uri,
|
resource_uri,
|
||||||
cim_creation_class_name,
|
cim_creation_class_name,
|
||||||
|
|
|
@ -249,6 +249,43 @@ class JobManagement(object):
|
||||||
job_id = doc.find(query).text
|
job_id = doc.find(query).text
|
||||||
return job_id
|
return job_id
|
||||||
|
|
||||||
|
def delete_jobs(self, job_ids=['JID_CLEARALL']):
|
||||||
|
"""Deletes the given jobs, or all jobs if none specified
|
||||||
|
|
||||||
|
:raises: WSManRequestFailure on request failures
|
||||||
|
:raises: WSManInvalidResponse when receiving invalid response
|
||||||
|
:raises: DRACOperationFailed on error reported back by the iDRAC
|
||||||
|
interface
|
||||||
|
:raises: DRACUnexpectedReturnValue on non-success
|
||||||
|
"""
|
||||||
|
|
||||||
|
selectors = {'SystemCreationClassName': 'DCIM_ComputerSystem',
|
||||||
|
'SystemName': 'idrac',
|
||||||
|
'CreationClassName': 'DCIM_JobService',
|
||||||
|
'Name': 'JobService'}
|
||||||
|
|
||||||
|
if job_ids is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
messages = []
|
||||||
|
|
||||||
|
for job_id in job_ids:
|
||||||
|
properties = {'JobID': job_id}
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.client.invoke(
|
||||||
|
uris.DCIM_JobService,
|
||||||
|
'DeleteJobQueue',
|
||||||
|
selectors,
|
||||||
|
properties,
|
||||||
|
expected_return_value=utils.RET_SUCCESS)
|
||||||
|
except exceptions.DRACOperationFailed as dof:
|
||||||
|
for message in dof.args:
|
||||||
|
messages.append(message + " " + job_id)
|
||||||
|
|
||||||
|
if len(messages):
|
||||||
|
raise exceptions.DRACOperationFailed(drac_messages=messages)
|
||||||
|
|
||||||
def delete_pending_config(
|
def delete_pending_config(
|
||||||
self, resource_uri, cim_creation_class_name, cim_name, target,
|
self, resource_uri, cim_creation_class_name, cim_name, target,
|
||||||
cim_system_creation_class_name='DCIM_ComputerSystem',
|
cim_system_creation_class_name='DCIM_ComputerSystem',
|
||||||
|
|
|
@ -103,6 +103,129 @@ class ClientJobManagementTestCase(base.BaseTest):
|
||||||
filter_query=expected_filter_query)
|
filter_query=expected_filter_query)
|
||||||
self.assertIsNone(job)
|
self.assertIsNone(job)
|
||||||
|
|
||||||
|
@mock.patch.object(dracclient.client.WSManClient, 'invoke',
|
||||||
|
spec_set=True, autospec=True)
|
||||||
|
def test_delete_jobs_all(self, mock_invoke):
|
||||||
|
expected_selectors = {'SystemCreationClassName': 'DCIM_ComputerSystem',
|
||||||
|
'SystemName': 'idrac',
|
||||||
|
'CreationClassName': 'DCIM_JobService',
|
||||||
|
'Name': 'JobService'}
|
||||||
|
expected_properties = {'JobID': 'JID_CLEARALL'}
|
||||||
|
|
||||||
|
self.drac_client.delete_jobs()
|
||||||
|
|
||||||
|
mock_invoke.assert_called_once_with(
|
||||||
|
mock.ANY, uris.DCIM_JobService, 'DeleteJobQueue',
|
||||||
|
expected_selectors, expected_properties,
|
||||||
|
expected_return_value=utils.RET_SUCCESS)
|
||||||
|
|
||||||
|
@mock.patch.object(dracclient.client.WSManClient, 'invoke',
|
||||||
|
spec_set=True, autospec=True)
|
||||||
|
def test_delete_jobs_force(self, mock_invoke):
|
||||||
|
expected_selectors = {'SystemCreationClassName': 'DCIM_ComputerSystem',
|
||||||
|
'SystemName': 'idrac',
|
||||||
|
'CreationClassName': 'DCIM_JobService',
|
||||||
|
'Name': 'JobService'}
|
||||||
|
expected_properties = {'JobID': 'JID_CLEARALL_FORCE'}
|
||||||
|
|
||||||
|
self.drac_client.delete_jobs(['JID_CLEARALL_FORCE'])
|
||||||
|
|
||||||
|
mock_invoke.assert_called_once_with(
|
||||||
|
mock.ANY, uris.DCIM_JobService, 'DeleteJobQueue',
|
||||||
|
expected_selectors, expected_properties,
|
||||||
|
expected_return_value=utils.RET_SUCCESS)
|
||||||
|
|
||||||
|
@mock.patch.object(dracclient.client.WSManClient, 'invoke',
|
||||||
|
spec_set=True, autospec=True)
|
||||||
|
def test_delete_jobs_one(self, mock_invoke):
|
||||||
|
expected_selectors = {'SystemCreationClassName': 'DCIM_ComputerSystem',
|
||||||
|
'SystemName': 'idrac',
|
||||||
|
'CreationClassName': 'DCIM_JobService',
|
||||||
|
'Name': 'JobService'}
|
||||||
|
expected_properties = {'JobID': 'JID_442507917525'}
|
||||||
|
|
||||||
|
self.drac_client.delete_jobs(['JID_442507917525'])
|
||||||
|
|
||||||
|
mock_invoke.assert_called_once_with(
|
||||||
|
mock.ANY, uris.DCIM_JobService, 'DeleteJobQueue',
|
||||||
|
expected_selectors, expected_properties,
|
||||||
|
expected_return_value=utils.RET_SUCCESS)
|
||||||
|
|
||||||
|
@mock.patch.object(dracclient.client.WSManClient, 'invoke',
|
||||||
|
spec_set=True, autospec=True)
|
||||||
|
def test_delete_jobs_multi(self, mock_invoke):
|
||||||
|
expected_selectors = {'SystemCreationClassName': 'DCIM_ComputerSystem',
|
||||||
|
'SystemName': 'idrac',
|
||||||
|
'CreationClassName': 'DCIM_JobService',
|
||||||
|
'Name': 'JobService'}
|
||||||
|
|
||||||
|
self.drac_client.delete_jobs(['JID_442507917525',
|
||||||
|
'JID_442507917526'])
|
||||||
|
|
||||||
|
calls_expected = [
|
||||||
|
mock.call(mock.ANY,
|
||||||
|
uris.DCIM_JobService,
|
||||||
|
'DeleteJobQueue',
|
||||||
|
expected_selectors,
|
||||||
|
{'JobID': 'JID_442507917525'},
|
||||||
|
expected_return_value=utils.RET_SUCCESS),
|
||||||
|
mock.call(mock.ANY,
|
||||||
|
uris.DCIM_JobService,
|
||||||
|
'DeleteJobQueue',
|
||||||
|
expected_selectors,
|
||||||
|
{'JobID': 'JID_442507917526'},
|
||||||
|
expected_return_value=utils.RET_SUCCESS)]
|
||||||
|
mock_invoke.assert_has_calls(calls_expected)
|
||||||
|
|
||||||
|
@mock.patch.object(dracclient.client.WSManClient, 'invoke',
|
||||||
|
spec_set=True, autospec=True)
|
||||||
|
def test_delete_jobs_none(self, mock_invoke):
|
||||||
|
self.drac_client.delete_jobs(None)
|
||||||
|
self.assertFalse(mock_invoke.called)
|
||||||
|
|
||||||
|
@mock.patch.object(dracclient.client.WSManClient, 'invoke',
|
||||||
|
spec_set=True, autospec=True)
|
||||||
|
def test_delete_jobs_empty_list(self, mock_invoke):
|
||||||
|
self.drac_client.delete_jobs([])
|
||||||
|
self.assertFalse(mock_invoke.called)
|
||||||
|
|
||||||
|
@requests_mock.Mocker()
|
||||||
|
@mock.patch.object(dracclient.client.WSManClient,
|
||||||
|
'wait_until_idrac_is_ready', spec_set=True,
|
||||||
|
autospec=True)
|
||||||
|
def test_delete_job_not_found(
|
||||||
|
self, mock_requests,
|
||||||
|
mock_wait_until_idrac_is_ready):
|
||||||
|
mock_requests.post(
|
||||||
|
'https://1.2.3.4:443/wsman',
|
||||||
|
text=test_utils.JobService[uris.DCIM_JobService][
|
||||||
|
'DeleteJobQueue']['error'])
|
||||||
|
self.assertRaises(
|
||||||
|
exceptions.DRACOperationFailed,
|
||||||
|
self.drac_client.delete_jobs,
|
||||||
|
['JID_1234'])
|
||||||
|
|
||||||
|
@requests_mock.Mocker()
|
||||||
|
@mock.patch.object(dracclient.client.WSManClient,
|
||||||
|
'wait_until_idrac_is_ready', spec_set=True,
|
||||||
|
autospec=True)
|
||||||
|
def test_delete_some_jobs_not_found(
|
||||||
|
self, mock_requests,
|
||||||
|
mock_wait_until_idrac_is_ready):
|
||||||
|
mock_requests.post(
|
||||||
|
'https://1.2.3.4:443/wsman',
|
||||||
|
[{'text': test_utils.JobService[uris.DCIM_JobService][
|
||||||
|
'DeleteJobQueue']['error']},
|
||||||
|
{'text': test_utils.JobService[uris.DCIM_JobService][
|
||||||
|
'DeleteJobQueue']['ok']}])
|
||||||
|
|
||||||
|
self.assertRaises(
|
||||||
|
exceptions.DRACOperationFailed,
|
||||||
|
self.drac_client.delete_jobs,
|
||||||
|
['JID_1234', 'JID_442507917525'])
|
||||||
|
|
||||||
|
self.assertEqual(mock_requests.call_count, 2)
|
||||||
|
|
||||||
@mock.patch.object(dracclient.client.WSManClient, 'invoke',
|
@mock.patch.object(dracclient.client.WSManClient, 'invoke',
|
||||||
spec_set=True, autospec=True)
|
spec_set=True, autospec=True)
|
||||||
def test_create_config_job(self, mock_invoke):
|
def test_create_config_job(self, mock_invoke):
|
||||||
|
@ -115,6 +238,7 @@ class ClientJobManagementTestCase(base.BaseTest):
|
||||||
'SystemName': 'DCIM:ComputerSystem'}
|
'SystemName': 'DCIM:ComputerSystem'}
|
||||||
expected_properties = {'Target': target,
|
expected_properties = {'Target': target,
|
||||||
'ScheduledStartTime': 'TIME_NOW'}
|
'ScheduledStartTime': 'TIME_NOW'}
|
||||||
|
|
||||||
mock_invoke.return_value = lxml.etree.fromstring(
|
mock_invoke.return_value = lxml.etree.fromstring(
|
||||||
test_utils.JobInvocations[uris.DCIM_BIOSService][
|
test_utils.JobInvocations[uris.DCIM_BIOSService][
|
||||||
'CreateTargetedConfigJob']['ok'])
|
'CreateTargetedConfigJob']['ok'])
|
||||||
|
|
|
@ -34,6 +34,7 @@ def load_wsman_xml(name):
|
||||||
|
|
||||||
return xml_body
|
return xml_body
|
||||||
|
|
||||||
|
|
||||||
WSManEnumerations = {
|
WSManEnumerations = {
|
||||||
'context': [
|
'context': [
|
||||||
load_wsman_xml('wsman-enum_context-1'),
|
load_wsman_xml('wsman-enum_context-1'),
|
||||||
|
@ -135,6 +136,17 @@ JobInvocations = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JobService = {
|
||||||
|
uris.DCIM_JobService: {
|
||||||
|
'DeleteJobQueue': {
|
||||||
|
'ok': load_wsman_xml(
|
||||||
|
'job_service-delete-job-id-ok'),
|
||||||
|
'error': load_wsman_xml(
|
||||||
|
'job_service-delete-job-id-error'),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
iDracCardEnumerations = {
|
iDracCardEnumerations = {
|
||||||
uris.DCIM_iDRACCardEnumeration: {
|
uris.DCIM_iDRACCardEnumeration: {
|
||||||
'ok': load_wsman_xml('idraccard_enumeration-enum-ok')
|
'ok': load_wsman_xml('idraccard_enumeration-enum-ok')
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
|
||||||
|
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
|
||||||
|
xmlns:n1="http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_JobService">
|
||||||
|
<s:Header>
|
||||||
|
<wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
|
||||||
|
</wsa:To>
|
||||||
|
<wsa:Action>http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_JobService/DeleteJobQueueResponse
|
||||||
|
</wsa:Action>
|
||||||
|
<wsa:RelatesTo>uuid:bd334a80-bd6f-4fc9-88cc-9c9cb79d41e8
|
||||||
|
</wsa:RelatesTo>
|
||||||
|
<wsa:MessageID>uuid:ce21f862-70ac-10ac-b40d-64b5b4da6618
|
||||||
|
</wsa:MessageID>
|
||||||
|
</s:Header>
|
||||||
|
<s:Body>
|
||||||
|
<n1:DeleteJobQueue_OUTPUT>
|
||||||
|
<n1:Message>Invalid Job ID</n1:Message>
|
||||||
|
<n1:MessageID>SUP011</n1:MessageID>
|
||||||
|
<n1:ReturnValue>2</n1:ReturnValue>
|
||||||
|
</n1:DeleteJobQueue_OUTPUT>
|
||||||
|
</s:Body>
|
||||||
|
</s:Envelope>
|
|
@ -0,0 +1,21 @@
|
||||||
|
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
|
||||||
|
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
|
||||||
|
xmlns:n1="http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_JobService">
|
||||||
|
<s:Header>
|
||||||
|
<wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
|
||||||
|
</wsa:To>
|
||||||
|
<wsa:Action>http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_JobService/DeleteJobQueueResponse
|
||||||
|
</wsa:Action>
|
||||||
|
<wsa:RelatesTo>uuid:5f1b62ee-19d4-4679-b083-477086856c79
|
||||||
|
</wsa:RelatesTo>
|
||||||
|
<wsa:MessageID>uuid:07b2e831-70ae-10ae-b56f-64b5b4da6618
|
||||||
|
</wsa:MessageID>
|
||||||
|
</s:Header>
|
||||||
|
<s:Body>
|
||||||
|
<n1:DeleteJobQueue_OUTPUT>
|
||||||
|
<n1:Message>The specified job was deleted</n1:Message>
|
||||||
|
<n1:MessageID>SUP020</n1:MessageID>
|
||||||
|
<n1:ReturnValue>0</n1:ReturnValue>
|
||||||
|
</n1:DeleteJobQueue_OUTPUT>
|
||||||
|
</s:Body>
|
||||||
|
</s:Envelope>
|
Loading…
Reference in New Issue