From d6121782d3aa6a95b883220b27a154e641b61f7f Mon Sep 17 00:00:00 2001
From: Artom Lifshitz <alifshit@redhat.com>
Date: Thu, 12 Jul 2018 14:34:51 -0400
Subject: [PATCH] Don't sent disk_over_commit if nova api > 2.24

In API microversion 2.25 Nova removed the disk_over_commit parameter
to the live migration server action. This patch makes sure that we
don't include it in our request if we're running with 2.25 or higher.

Story: #2002963
Task: #22966
Change-Id: I1bbdd33be96d82422a05982508e370237c3560f3
---
 openstackclient/compute/v2/server.py          | 13 ++++---
 .../tests/unit/compute/v2/test_server.py      | 35 +++++++++++++++++++
 2 files changed, 43 insertions(+), 5 deletions(-)

diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index 777f7744e7..a6a5908440 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -21,6 +21,7 @@ import io
 import logging
 import os
 
+from novaclient import api_versions
 from novaclient.v2 import servers
 from osc_lib.cli import parseractions
 from osc_lib.command import command
@@ -1384,11 +1385,13 @@ class MigrateServer(command.Command):
             parsed_args.server,
         )
         if parsed_args.live:
-            server.live_migrate(
-                host=parsed_args.live,
-                block_migration=parsed_args.block_migration,
-                disk_over_commit=parsed_args.disk_overcommit,
-            )
+            kwargs = {
+                'host': parsed_args.live,
+                'block_migration': parsed_args.block_migration
+            }
+            if compute_client.api_version < api_versions.APIVersion('2.25'):
+                kwargs['disk_over_commit'] = parsed_args.disk_overcommit
+            server.live_migrate(**kwargs)
         else:
             if parsed_args.block_migration or parsed_args.disk_overcommit:
                 raise exceptions.CommandError("--live must be specified if "
diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py
index 46d4c24114..b3d326819b 100644
--- a/openstackclient/tests/unit/compute/v2/test_server.py
+++ b/openstackclient/tests/unit/compute/v2/test_server.py
@@ -18,6 +18,7 @@ import getpass
 
 import mock
 from mock import call
+from novaclient import api_versions
 from osc_lib import exceptions
 from osc_lib import utils as common_utils
 from oslo_utils import timeutils
@@ -2207,6 +2208,9 @@ class TestServerMigrate(TestServer):
         ]
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 
+        self.app.client_manager.compute.api_version = \
+            api_versions.APIVersion('2.24')
+
         result = self.cmd.take_action(parsed_args)
 
         self.servers_mock.get.assert_called_with(self.server.id)
@@ -2228,6 +2232,9 @@ class TestServerMigrate(TestServer):
         ]
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 
+        self.app.client_manager.compute.api_version = \
+            api_versions.APIVersion('2.24')
+
         result = self.cmd.take_action(parsed_args)
 
         self.servers_mock.get.assert_called_with(self.server.id)
@@ -2249,6 +2256,9 @@ class TestServerMigrate(TestServer):
         ]
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 
+        self.app.client_manager.compute.api_version = \
+            api_versions.APIVersion('2.24')
+
         result = self.cmd.take_action(parsed_args)
 
         self.servers_mock.get.assert_called_with(self.server.id)
@@ -2271,6 +2281,9 @@ class TestServerMigrate(TestServer):
         ]
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 
+        self.app.client_manager.compute.api_version = \
+            api_versions.APIVersion('2.24')
+
         result = self.cmd.take_action(parsed_args)
 
         self.servers_mock.get.assert_called_with(self.server.id)
@@ -2280,6 +2293,28 @@ class TestServerMigrate(TestServer):
         self.assertNotCalled(self.servers_mock.migrate)
         self.assertIsNone(result)
 
+    def test_server_live_migrate_225(self):
+        arglist = [
+            '--live', 'fakehost', self.server.id,
+        ]
+        verifylist = [
+            ('live', 'fakehost'),
+            ('block_migration', False),
+            ('wait', False),
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        self.app.client_manager.compute.api_version = \
+            api_versions.APIVersion('2.25')
+
+        result = self.cmd.take_action(parsed_args)
+
+        self.servers_mock.get.assert_called_with(self.server.id)
+        self.server.live_migrate.assert_called_with(block_migration=False,
+                                                    host='fakehost')
+        self.assertNotCalled(self.servers_mock.migrate)
+        self.assertIsNone(result)
+
     @mock.patch.object(common_utils, 'wait_for_status', return_value=True)
     def test_server_migrate_with_wait(self, mock_wait_for_status):
         arglist = [