From 7f03b092a4b55536af37e6b8f1ffd3a3cde1ed02 Mon Sep 17 00:00:00 2001
From: Aarti Kriplani <aarti.kriplani@RACKSPACE.COM>
Date: Thu, 6 Jun 2013 15:49:58 +0530
Subject: [PATCH] Migrate each instances of a host to another.

Added a new extension that adds the ability for admins to migrate all
servers of a host to another available hosts.

Implements blueprint host-servers-migrate
Change-Id: I4e9c4be7ceb098d7a3bf553fd44addd46e8bce72
---
 novaclient/tests/v1_1/test_shell.py           | 12 +++++
 .../v1_1/contrib/host_servers_migrate.py      | 49 +++++++++++++++++++
 2 files changed, 61 insertions(+)
 create mode 100644 novaclient/v1_1/contrib/host_servers_migrate.py

diff --git a/novaclient/tests/v1_1/test_shell.py b/novaclient/tests/v1_1/test_shell.py
index 8defd288d..4b3aeedbc 100644
--- a/novaclient/tests/v1_1/test_shell.py
+++ b/novaclient/tests/v1_1/test_shell.py
@@ -1017,6 +1017,18 @@ class ShellTest(utils.TestCase):
                            {'evacuate': {'host': None,
                                          'onSharedStorage': True}}, pos=4)
 
+    def test_host_servers_migrate(self):
+        self.run_command('host-servers-migrate hyper')
+        self.assert_called('GET', '/os-hypervisors/hyper/servers', pos=0)
+        self.assert_called('POST',
+                           '/servers/uuid1/action', {'migrate': None}, pos=1)
+        self.assert_called('POST',
+                           '/servers/uuid2/action', {'migrate': None}, pos=2)
+        self.assert_called('POST',
+                           '/servers/uuid3/action', {'migrate': None}, pos=3)
+        self.assert_called('POST',
+                           '/servers/uuid4/action', {'migrate': None}, pos=4)
+
     def test_coverage_start(self):
         self.run_command('coverage-start')
         self.assert_called('POST', '/os-coverage/action')
diff --git a/novaclient/v1_1/contrib/host_servers_migrate.py b/novaclient/v1_1/contrib/host_servers_migrate.py
new file mode 100644
index 000000000..3076dc51d
--- /dev/null
+++ b/novaclient/v1_1/contrib/host_servers_migrate.py
@@ -0,0 +1,49 @@
+# Copyright 2013 Rackspace Hosting
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from novaclient import base
+from novaclient import utils
+
+
+class HostServersMigrateResponse(base.Resource):
+    pass
+
+
+def _server_migrate(cs, server):
+    success = True
+    error_message = ""
+    try:
+        cs.servers.migrate(server['uuid'])
+    except Exception as e:
+        success = False
+        error_message = "Error while migrating instance: %s" % e
+    return HostServersMigrateResponse(base.Manager,
+                                      {"server_uuid": server['uuid'],
+                                       "migration_accepted": success,
+                                       "error_message": error_message})
+
+
+@utils.arg('host', metavar='<host>', help='Name of host.')
+def do_host_servers_migrate(cs, args):
+    """Migrate all instances of the specified host to other available hosts."""
+    hypervisors = cs.hypervisors.search(args.host, servers=True)
+    response = []
+    for hyper in hypervisors:
+        if hasattr(hyper, 'servers'):
+            for server in hyper.servers:
+                response.append(_server_migrate(cs, server))
+
+    utils.print_list(response,
+                     ["Server UUID", "Migration Accepted", "Error Message"])