Merge "API test for 'create server with scheduler hints'"
diff --git a/tempest/api/compute/admin/test_servers.py b/tempest/api/compute/admin/test_servers.py
index 77431bb..1f2ddf4 100644
--- a/tempest/api/compute/admin/test_servers.py
+++ b/tempest/api/compute/admin/test_servers.py
@@ -185,6 +185,16 @@
         resp, server_body = self.client.inject_network_info(server['id'])
         self.assertEqual(202, resp.status)
 
+    @test.attr(type='gate')
+    def test_create_server_with_scheduling_hint(self):
+        # Create a server with scheduler hints.
+        hints = {
+            'same_host': self.s1_id
+        }
+        resp, server = self.create_test_server(sched_hints=hints,
+                                               wait_until='ACTIVE')
+        self.assertEqual('202', resp['status'])
+
 
 class ServersAdminTestXML(ServersAdminTestJSON):
     _host_key = (
diff --git a/tempest/services/compute/json/servers_client.py b/tempest/services/compute/json/servers_client.py
index 4eba2b4..d6705db 100644
--- a/tempest/services/compute/json/servers_client.py
+++ b/tempest/services/compute/json/servers_client.py
@@ -78,7 +78,12 @@
             value = kwargs.get(key)
             if value is not None:
                 post_body[post_param] = value
-        post_body = json.dumps({'server': post_body})
+        post_body = {'server': post_body}
+
+        if 'sched_hints' in kwargs:
+            hints = {'os:scheduler_hints': kwargs.get('sched_hints')}
+            post_body = dict(post_body.items() + hints.items())
+        post_body = json.dumps(post_body)
         resp, body = self.post('servers', post_body)
 
         body = json.loads(body)
diff --git a/tempest/services/compute/xml/servers_client.py b/tempest/services/compute/xml/servers_client.py
index 1215b80..7a2a071 100644
--- a/tempest/services/compute/xml/servers_client.py
+++ b/tempest/services/compute/xml/servers_client.py
@@ -360,6 +360,15 @@
                 temp.append(Text(k['contents']))
                 personality.append(temp)
 
+        if 'sched_hints' in kwargs:
+            sched_hints = kwargs.get('sched_hints')
+            hints = Element("os:scheduler_hints")
+            hints.add_attr('xmlns:os', XMLNS_11)
+            for attr in sched_hints:
+                p1 = Element(attr)
+                p1.append(sched_hints[attr])
+                hints.append(p1)
+            server.append(hints)
         resp, body = self.post('servers', str(Document(server)))
         server = self._parse_server(etree.fromstring(body))
         return resp, server