Refactor network client: add create_ and update_ methods

Automatic create_ and update_ methods are added.
create_pool and update_pool modified in this patch serve
as an example of the usage.
For XML client simplistic json to xml serialization is used for now.

Change-Id: I8eb17d2aacfd4d2eacd8821b4b66e112626843a7
diff --git a/tempest/api/network/base.py b/tempest/api/network/base.py
index 064eaff..318d891 100644
--- a/tempest/api/network/base.py
+++ b/tempest/api/network/base.py
@@ -169,13 +169,23 @@
     @classmethod
     def create_pool(cls, name, lb_method, protocol, subnet):
         """Wrapper utility that returns a test pool."""
-        resp, body = cls.client.create_pool(name, lb_method, protocol,
-                                            subnet['id'])
+        resp, body = cls.client.create_pool(
+            name=name,
+            lb_method=lb_method,
+            protocol=protocol,
+            subnet_id=subnet['id'])
         pool = body['pool']
         cls.pools.append(pool)
         return pool
 
     @classmethod
+    def update_pool(cls, name):
+        """Wrapper utility that returns a test pool."""
+        resp, body = cls.client.update_pool(name=name)
+        pool = body['pool']
+        return pool
+
+    @classmethod
     def create_vip(cls, name, protocol, protocol_port, subnet, pool):
         """Wrapper utility that returns a test vip."""
         resp, body = cls.client.create_vip(name, protocol, protocol_port,
diff --git a/tempest/api/network/test_load_balancer.py b/tempest/api/network/test_load_balancer.py
index 7e4ec37..224c36c 100644
--- a/tempest/api/network/test_load_balancer.py
+++ b/tempest/api/network/test_load_balancer.py
@@ -69,9 +69,11 @@
     def test_create_update_delete_pool_vip(self):
         # Creates a vip
         name = data_utils.rand_name('vip-')
-        resp, body = self.client.create_pool(data_utils.rand_name("pool-"),
-                                             "ROUND_ROBIN", "HTTP",
-                                             self.subnet['id'])
+        resp, body = self.client.create_pool(
+            name=data_utils.rand_name("pool-"),
+            lb_method='ROUND_ROBIN',
+            protocol='HTTP',
+            subnet_id=self.subnet['id'])
         pool = body['pool']
         resp, body = self.client.create_vip(name, "HTTP", 80,
                                             self.subnet['id'], pool['id'])
@@ -89,7 +91,8 @@
         self.assertEqual('204', resp['status'])
         # Verification of pool update
         new_name = "New_pool"
-        resp, body = self.client.update_pool(pool['id'], new_name)
+        resp, body = self.client.update_pool(pool['id'],
+                                             name=new_name)
         self.assertEqual('200', resp['status'])
         updated_pool = body['pool']
         self.assertEqual(updated_pool['name'], new_name)
diff --git a/tempest/services/network/json/network_client.py b/tempest/services/network/json/network_client.py
index b323dc6..e26697e 100644
--- a/tempest/services/network/json/network_client.py
+++ b/tempest/services/network/json/network_client.py
@@ -46,6 +46,9 @@
         # {'resources': [ res1, res2] }
         return res[res.keys()[0]]
 
+    def serialize(self, data):
+        return json.dumps(data)
+
     def create_network(self, name, **kwargs):
         post_body = {'network': kwargs}
         post_body['network']['name'] = name
@@ -303,21 +306,6 @@
         body = json.loads(body)
         return resp, body
 
-    def create_pool(self, name, lb_method, protocol, subnet_id):
-        post_body = {
-            "pool": {
-                "protocol": protocol,
-                "name": name,
-                "subnet_id": subnet_id,
-                "lb_method": lb_method
-            }
-        }
-        body = json.dumps(post_body)
-        uri = '%s/lb/pools' % (self.uri_prefix)
-        resp, body = self.post(uri, body)
-        body = json.loads(body)
-        return resp, body
-
     def update_vip(self, vip_id, new_name):
         put_body = {
             "vip": {
@@ -330,18 +318,6 @@
         body = json.loads(body)
         return resp, body
 
-    def update_pool(self, pool_id, new_name):
-        put_body = {
-            "pool": {
-                "name": new_name,
-            }
-        }
-        body = json.dumps(put_body)
-        uri = '%s/lb/pools/%s' % (self.uri_prefix, pool_id)
-        resp, body = self.put(uri, body)
-        body = json.loads(body)
-        return resp, body
-
     def create_member(self, address, protocol_port, pool_id):
         post_body = {
             "member": {
diff --git a/tempest/services/network/network_client_base.py b/tempest/services/network/network_client_base.py
index 45ea2d6..42ca5bf 100644
--- a/tempest/services/network/network_client_base.py
+++ b/tempest/services/network/network_client_base.py
@@ -124,11 +124,35 @@
 
         return _show
 
+    def _creater(self, resource_name):
+        def _create(**kwargs):
+            plural = self.pluralize(resource_name)
+            uri = self.get_uri(plural)
+            post_data = self.serialize({resource_name: kwargs})
+            resp, body = self.post(uri, post_data)
+            body = self.deserialize_single(body)
+            return resp, body
+
+        return _create
+
+    def _updater(self, resource_name):
+        def _update(res_id, **kwargs):
+            plural = self.pluralize(resource_name)
+            uri = '%s/%s' % (self.get_uri(plural), res_id)
+            post_data = self.serialize({resource_name: kwargs})
+            resp, body = self.put(uri, post_data)
+            body = self.deserialize_single(body)
+            return resp, body
+
+        return _update
+
     def __getattr__(self, name):
-        method_prefixes = ["list_", "delete_", "show_"]
+        method_prefixes = ["list_", "delete_", "show_", "create_", "update_"]
         method_functors = [self._lister,
                            self._deleter,
-                           self._shower]
+                           self._shower,
+                           self._creater,
+                           self._updater]
         for index, prefix in enumerate(method_prefixes):
             prefix_len = len(prefix)
             if name[:prefix_len] == prefix:
diff --git a/tempest/services/network/xml/network_client.py b/tempest/services/network/xml/network_client.py
index 155fa35..a57f278 100644
--- a/tempest/services/network/xml/network_client.py
+++ b/tempest/services/network/xml/network_client.py
@@ -41,6 +41,16 @@
     def deserialize_single(self, body):
         return _root_tag_fetcher_and_xml_to_json_parse(body)
 
+    def serialize(self, body):
+        #TODO(enikanorov): implement better json to xml conversion
+        # expecting the dict with single key
+        root = body.keys()[0]
+        post_body = Element(root)
+        for name, attr in body[root].items():
+            elt = Element(name, attr)
+            post_body.append(elt)
+        return str(Document(post_body))
+
     def create_network(self, name):
         uri = '%s/networks' % (self.uri_prefix)
         post_body = Element("network")
@@ -195,28 +205,6 @@
         body = _root_tag_fetcher_and_xml_to_json_parse(body)
         return resp, body
 
-    def create_pool(self, name, lb_method, protocol, subnet_id):
-        uri = '%s/lb/pools' % (self.uri_prefix)
-        post_body = Element("pool")
-        p1 = Element("lb_method", lb_method)
-        p2 = Element("protocol", protocol)
-        p3 = Element("subnet_id", subnet_id)
-        post_body.append(p1)
-        post_body.append(p2)
-        post_body.append(p3)
-        resp, body = self.post(uri, str(Document(post_body)))
-        body = _root_tag_fetcher_and_xml_to_json_parse(body)
-        return resp, body
-
-    def update_pool(self, pool_id, new_name):
-        uri = '%s/lb/pools/%s' % (self.uri_prefix, str(pool_id))
-        put_body = Element("pool")
-        p2 = Element("name", new_name)
-        put_body.append(p2)
-        resp, body = self.put(uri, str(Document(put_body)))
-        body = _root_tag_fetcher_and_xml_to_json_parse(body)
-        return resp, body
-
     def create_member(self, address, protocol_port, pool_id):
         uri = '%s/lb/members' % (self.uri_prefix)
         post_body = Element("member")