Fix error in delete_composednode

Cureently delete_composednode method doesn't work because it call a url
like '/redfish/v1/Nodes101'.

Change-Id: Ib2a961f3f97de028018ff8e5269f875eae329d01
Closes-Bug: #1652784
This commit is contained in:
Yufei 2016-12-29 15:57:51 +08:00 committed by octopuszhang
parent e32e99f254
commit 978dff9fbe
3 changed files with 57 additions and 2 deletions

View File

@ -328,10 +328,13 @@ def compose_node(request_body):
def delete_composednode(nodeid): def delete_composednode(nodeid):
nodes_url = get_base_resource_url("Nodes") nodes_url = get_base_resource_url("Nodes")
delete_url = nodes_url + str(nodeid) delete_url = nodes_url + '/' + str(nodeid)
resp = send_request(delete_url, "DELETE") resp = send_request(delete_url, "DELETE")
if resp.status_code == http_client.NO_CONTENT: if resp.status_code == http_client.NO_CONTENT:
return exception.confirmation("", "DELETED"), resp.status_code # we should return 200 status code instead of 204, because 204 means
# 'No Content', the message in resp_dict will be ignored in that way
resp_dict = exception.confirmation(confirm_detail="DELETED")
return utils.make_response(http_client.OK, resp_dict)
else: else:
raise exception.RedfishException(resp.json(), raise exception.RedfishException(resp.json(),
status_code=resp.status_code) status_code=resp.status_code)

View File

@ -145,3 +145,21 @@ def fake_system_ethernet_interfaces():
{"@odata.id": "/redfish/v1/Systems/1/EthernetInterfaces/2"} {"@odata.id": "/redfish/v1/Systems/1/EthernetInterfaces/2"}
] ]
} }
def fake_delete_composednode_ok():
return {}
def fake_delete_composednode_fail():
return {
"error": {
"code": "Base.1.0.UnknownException",
"message": "The specified node could not be disassembled",
"@Message.ExtendedInfo": [{
"Message": "Disassembly failed: Could not power off composed "
"node: ComputerSystem 33 reset action"
"(GracefulShutdown) failed"
}]
}
}

View File

@ -16,6 +16,7 @@ import mock
from requests.compat import urljoin from requests.compat import urljoin
from six.moves import http_client from six.moves import http_client
from valence.common import exception
from valence import config as cfg from valence import config as cfg
from valence.redfish import redfish from valence.redfish import redfish
from valence.tests.unit.fakes import redfish_fakes as fakes from valence.tests.unit.fakes import redfish_fakes as fakes
@ -184,3 +185,36 @@ class TestRedfish(TestCase):
expected = '600' expected = '600'
result = redfish.system_storage_details("/redfish/v1/Systems/test") result = redfish.system_storage_details("/redfish/v1/Systems/test")
self.assertEqual(expected, result) self.assertEqual(expected, result)
@mock.patch('valence.common.utils.make_response')
@mock.patch('valence.redfish.redfish.get_base_resource_url')
@mock.patch('valence.redfish.redfish.send_request')
def test_delete_composednode_ok(self, mock_request, mock_get_url,
mock_make_response):
mock_get_url.return_value = '/redfish/v1/Nodes'
delete_result = fakes.fake_delete_composednode_ok()
fake_delete_resopnse = fakes.mock_request_get(delete_result,
http_client.NO_CONTENT)
mock_request.return_value = fake_delete_resopnse
redfish.delete_composednode(101)
mock_request.assert_called_with('/redfish/v1/Nodes/101', 'DELETE')
expected_content = {
"code": "",
"detail": "DELETED",
"request_id": exception.FAKE_REQUEST_ID,
}
mock_make_response.assert_called_with(http_client.OK, expected_content)
@mock.patch('valence.common.utils.make_response')
@mock.patch('valence.redfish.redfish.get_base_resource_url')
@mock.patch('valence.redfish.redfish.send_request')
def test_delete_composednode_fail(self, mock_request, mock_get_url,
mock_make_response):
mock_get_url.return_value = '/redfish/v1/Nodes'
delete_result = fakes.fake_delete_composednode_fail()
fake_resp = fakes.mock_request_get(delete_result,
http_client.INTERNAL_SERVER_ERROR)
mock_request.return_value = fake_resp
self.assertRaises(exception.RedfishException,
redfish.delete_composednode, 101)
self.assertFalse(mock_make_response.called)