Add compute support server live migrate operation
Implements: blueprint add-compute-migrate Change-Id: I16e40a946565a94a1ecff0ad522c7cc79bdb234e Signed-off-by: Yuanbin.Chen <cybing4@gmail.com>
This commit is contained in:
parent
e32910a582
commit
7946243705
|
@ -64,6 +64,7 @@ Starting, Stopping, etc.
|
||||||
.. automethod:: openstack.compute.v2._proxy.Proxy.evacuate_server
|
.. automethod:: openstack.compute.v2._proxy.Proxy.evacuate_server
|
||||||
.. automethod:: openstack.compute.v2._proxy.Proxy.migrate_server
|
.. automethod:: openstack.compute.v2._proxy.Proxy.migrate_server
|
||||||
.. automethod:: openstack.compute.v2._proxy.Proxy.get_server_console_output
|
.. automethod:: openstack.compute.v2._proxy.Proxy.get_server_console_output
|
||||||
|
.. automethod:: openstack.compute.v2._proxy.Proxy.live_migrate_server
|
||||||
|
|
||||||
Modifying a Server
|
Modifying a Server
|
||||||
******************
|
******************
|
||||||
|
|
|
@ -1267,6 +1267,18 @@ class Proxy(proxy2.BaseProxy):
|
||||||
:class:`~openstack.compute.v2.server.Server` instance.
|
:class:`~openstack.compute.v2.server.Server` instance.
|
||||||
:returns: None
|
:returns: None
|
||||||
"""
|
"""
|
||||||
|
|
||||||
server = self._get_resource(_server.Server, server)
|
server = self._get_resource(_server.Server, server)
|
||||||
server.migrate(self._session)
|
server.migrate(self._session)
|
||||||
|
|
||||||
|
def live_migrate_server(self, server, host=None, force=False):
|
||||||
|
"""Migrate a server from one host to target host
|
||||||
|
|
||||||
|
:param server: Either the ID of a server or a
|
||||||
|
:class:`~openstack.compute.v2.server.Server` instance.
|
||||||
|
:param host: The host to which to migrate the server
|
||||||
|
:param force: Force a live-migration by not verifying the provided
|
||||||
|
destination host by the scheduler.
|
||||||
|
:returns: None
|
||||||
|
"""
|
||||||
|
server = self._get_resource(_server.Server, server)
|
||||||
|
server.live_migrate(self._session, host, force)
|
||||||
|
|
|
@ -357,6 +357,16 @@ class Server(resource2.Resource, metadata.MetadataMixin):
|
||||||
resp = self._action(session, body)
|
resp = self._action(session, body)
|
||||||
return resp.json()
|
return resp.json()
|
||||||
|
|
||||||
|
def live_migrate(self, session, host, force):
|
||||||
|
body = {
|
||||||
|
"os-migrateLive": {
|
||||||
|
"host": host,
|
||||||
|
"block_migration": "auto",
|
||||||
|
"force": force
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self._action(session, body)
|
||||||
|
|
||||||
|
|
||||||
class ServerDetail(Server):
|
class ServerDetail(Server):
|
||||||
base_path = '/servers/detail'
|
base_path = '/servers/detail'
|
||||||
|
|
|
@ -510,3 +510,9 @@ class TestComputeProxy(test_proxy_base2.TestProxyBase):
|
||||||
self.proxy.force_service_down,
|
self.proxy.force_service_down,
|
||||||
method_args=["value", "host1", "nova-compute"],
|
method_args=["value", "host1", "nova-compute"],
|
||||||
expected_args=["host1", "nova-compute"])
|
expected_args=["host1", "nova-compute"])
|
||||||
|
|
||||||
|
def test_live_migrate_server(self):
|
||||||
|
self._verify('openstack.compute.v2.server.Server.live_migrate',
|
||||||
|
self.proxy.live_migrate_server,
|
||||||
|
method_args=["value", "host1", "force"],
|
||||||
|
expected_args=["host1", "force"])
|
||||||
|
|
|
@ -654,3 +654,22 @@ class TestServer(testtools.TestCase):
|
||||||
headers = {'Accept': ''}
|
headers = {'Accept': ''}
|
||||||
self.sess.post.assert_called_with(
|
self.sess.post.assert_called_with(
|
||||||
url, endpoint_filter=sot.service, json=body, headers=headers)
|
url, endpoint_filter=sot.service, json=body, headers=headers)
|
||||||
|
|
||||||
|
def test_live_migrate(self):
|
||||||
|
sot = server.Server(**EXAMPLE)
|
||||||
|
|
||||||
|
res = sot.live_migrate(self.sess, host='HOST2', force=False)
|
||||||
|
|
||||||
|
self.assertIsNone(res)
|
||||||
|
url = 'servers/IDENTIFIER/action'
|
||||||
|
body = {
|
||||||
|
"os-migrateLive": {
|
||||||
|
"host": 'HOST2',
|
||||||
|
"block_migration": "auto",
|
||||||
|
"force": False
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
headers = {'Accept': ''}
|
||||||
|
self.sess.post.assert_called_with(
|
||||||
|
url, endpoint_filter=sot.service, json=body, headers=headers)
|
||||||
|
|
Loading…
Reference in New Issue