Fix server.action does not work

As description in nova api document, server action request should use
the post method, with no response body return.

Fix this bug by modified request method from 'put' to 'post', and
also add a boolean parameter 'has_response' in action method to avoid
empty response body exception in response parsing.

Change-Id: Ie37e9745b3c924049f7fd563e43e5de55c711af7
Closes-Bug:#1509141
This commit is contained in:
yan.haifeng 2015-10-25 17:14:36 +08:00
parent 7b0ba7bfbb
commit 2700f034a1
2 changed files with 36 additions and 23 deletions

View File

@ -86,10 +86,14 @@ class Server(resource.Resource):
return body
def action(self, session, body):
def action(self, session, body, has_response=False):
"""Preform server actions given the message body."""
url = utils.urljoin(self.base_path, self.id, 'action')
resp = session.put(url, service=self.service, json=body).body
if has_response:
resp = session.post(url, service=self.service, json=body)
else:
resp = session.post(
url, service=self.service, json=body, accept=None)
return resp
def change_password(self, session, new_password):

View File

@ -45,10 +45,10 @@ class TestServer(testtools.TestCase):
def setUp(self):
super(TestServer, self).setUp()
self.resp = mock.Mock()
self.resp.body = ''
self.resp = ''
self.sess = mock.Mock()
self.sess.put = mock.MagicMock()
self.sess.put.return_value = self.resp
self.sess.post = mock.MagicMock()
self.sess.post.return_value = self.resp
def test_basic(self):
sot = server.Server()
@ -105,26 +105,28 @@ class TestServer(testtools.TestCase):
def test_change_passowrd(self):
sot = server.Server(EXAMPLE)
self.assertEqual(self.resp.body, sot.change_password(self.sess, 'a'))
self.assertEqual(self.resp, sot.change_password(self.sess, 'a'))
url = 'servers/IDENTIFIER/action'
body = {"changePassword": {"adminPass": "a"}}
self.sess.put.assert_called_with(url, service=sot.service, json=body)
self.sess.post.assert_called_with(
url, service=sot.service, json=body, accept=None)
def test_reboot(self):
sot = server.Server(EXAMPLE)
self.assertEqual(self.resp.body, sot.reboot(self.sess, 'HARD'))
self.assertEqual(self.resp, sot.reboot(self.sess, 'HARD'))
url = 'servers/IDENTIFIER/action'
body = {"reboot": {"type": "HARD"}}
self.sess.put.assert_called_with(url, service=sot.service, json=body)
self.sess.post.assert_called_with(
url, service=sot.service, json=body, accept=None)
def test_rebuild(self):
sot = server.Server(EXAMPLE)
self.assertEqual(
self.resp.body,
self.resp,
sot.rebuild(
self.sess,
name='noo',
@ -149,13 +151,14 @@ class TestServer(testtools.TestCase):
"personality": [{"path": "/etc/motd", "contents": "foo"}],
}
}
self.sess.put.assert_called_with(url, service=sot.service, json=body)
self.sess.post.assert_called_with(
url, service=sot.service, json=body, accept=None)
def test_rebuild_minimal(self):
sot = server.Server(EXAMPLE)
self.assertEqual(
self.resp.body,
self.resp,
sot.rebuild(
self.sess,
name='nootoo',
@ -172,34 +175,38 @@ class TestServer(testtools.TestCase):
"adminPass": "seekr3two",
}
}
self.sess.put.assert_called_with(url, service=sot.service, json=body)
self.sess.post.assert_called_with(
url, service=sot.service, json=body, accept=None)
def test_resize(self):
sot = server.Server(EXAMPLE)
self.assertEqual(self.resp.body, sot.resize(self.sess, '2'))
self.assertEqual(self.resp, sot.resize(self.sess, '2'))
url = 'servers/IDENTIFIER/action'
body = {"resize": {"flavorRef": "2"}}
self.sess.put.assert_called_with(url, service=sot.service, json=body)
self.sess.post.assert_called_with(
url, service=sot.service, json=body, accept=None)
def test_confirm_resize(self):
sot = server.Server(EXAMPLE)
self.assertEqual(self.resp.body, sot.confirm_resize(self.sess))
self.assertEqual(self.resp, sot.confirm_resize(self.sess))
url = 'servers/IDENTIFIER/action'
body = {"confirmResize": None}
self.sess.put.assert_called_with(url, service=sot.service, json=body)
self.sess.post.assert_called_with(
url, service=sot.service, json=body, accept=None)
def test_revert_resize(self):
sot = server.Server(EXAMPLE)
self.assertEqual(self.resp.body, sot.revert_resize(self.sess))
self.assertEqual(self.resp, sot.revert_resize(self.sess))
url = 'servers/IDENTIFIER/action'
body = {"revertResize": None}
self.sess.put.assert_called_with(url, service=sot.service, json=body)
self.sess.post.assert_called_with(
url, service=sot.service, json=body, accept=None)
def test_create_image(self):
sot = server.Server(EXAMPLE)
@ -207,26 +214,28 @@ class TestServer(testtools.TestCase):
metadata = {'nu': 'image', 'created': 'today'}
self.assertEqual(
self.resp.body,
self.resp,
sot.create_image(self.sess, name, metadata)
)
url = 'servers/IDENTIFIER/action'
body = {"createImage": {'name': name, 'metadata': metadata}}
self.sess.put.assert_called_with(url, service=sot.service, json=body)
self.sess.post.assert_called_with(
url, service=sot.service, json=body, accept=None)
def test_create_image_minimal(self):
sot = server.Server(EXAMPLE)
name = 'noo'
self.assertEqual(
self.resp.body,
self.resp,
sot.create_image(self.sess, name)
)
url = 'servers/IDENTIFIER/action'
body = {"createImage": {'name': name}}
self.sess.put.assert_called_with(url, service=sot.service, json=body)
self.sess.post.assert_called_with(
url, service=sot.service, json=body, accept=None)
def test_get_ips(self):
name = "jenkins"