Generic methods implementation in OOS Compute
authorStavros Sachtouris <saxtouri@admin.grnet.gr>
Mon, 3 Sep 2012 15:24:08 +0000 (18:24 +0300)
committerStavros Sachtouris <saxtouri@admin.grnet.gr>
Mon, 3 Sep 2012 15:24:08 +0000 (18:24 +0300)
added flavors_get, images_get/delete/post/put

kamaki/clients/compute.py
kamaki/clients/cyclades.py
kamaki/commands/cyclades_cli.py

index 8b227dc..f21715f 100644 (file)
@@ -54,18 +54,65 @@ class ComputeClient(Client):
             details = unicode(r.request.method)+' '+unicode(r.request.url)
         raise ClientError(message, r.status_code, details)
     
+    def servers_get(self, server_id='', command='', **kwargs):
+        """GET base_url/servers[/server_id][/command] request
+        @param server_id or ''
+        @param command: can be 'ips', 'stats', or ''
+        """
+        path = path4url('servers', server_id, command)
+        success = kwargs.pop('success', 200)
+        return self.get(path, success=success, **kwargs)
+
+    def servers_delete(self, server_id='', command='', **kwargs):
+        """DEL ETE base_url/servers[/server_id][/command] request
+        @param server_id or ''
+        @param command: can be 'ips', 'stats', or ''
+        """
+        path = path4url('servers', server_id, command)
+        success = kwargs.pop('success', 204)
+        return self.delete(path, success=success, **kwargs)
+
+    def servers_post(self, server_id='', command='', json_data=None, **kwargs):
+        """POST base_url/servers[/server_id]/[command] request
+        @param server_id or ''
+        @param command: can be 'action' or ''
+        @param json_data: a json valid dict that will be send as data
+        """
+        data = json_data
+        if json_data is not None:
+            data = json.dumps(json_data)
+            self.set_header('Content-Type', 'application/json')
+            self.set_header('Content-Length', len(data))
+
+        path = path4url('servers', server_id, command)
+        success = kwargs.pop('success', 202)
+        return self.post(path, data=data, success=success, **kwargs)
+
+    def servers_put(self, server_id='', command='', json_data=None, **kwargs):
+        """PUT base_url/servers[/server_id]/[command] request
+        @param server_id or ''
+        @param command: can be 'action' or ''
+        @param json_data: a json valid dict that will be send as data
+        """
+        data = json_data
+        if json_data is not None:
+            data = json.dumps(json_data)
+            self.set_header('Content-Type', 'application/json')
+            self.set_header('Content-Length', len(data))
+
+        path = path4url('servers', server_id, command)
+        success = kwargs.pop('success', 204)
+        return self.put(path, data=data, success=success, **kwargs)
+
     def list_servers(self, detail=False):
         """List servers, returned detailed output if detailed is True"""
-        
-        path = path4url('servers','detail') if detail else path4url('servers')
-        r = self.get(path, success=200)
+        detail = 'detail' if detail else ''
+        r = self.servers_get(command=detail)
         return r.json['servers']['values']
     
     def get_server_details(self, server_id):
         """Return detailed output on a server specified by its id"""
-        
-        path = path4url('servers', server_id)
-        r = self.get(path, success=200)
+        r = self.servers_get(server_id)
         return r.json['server']
     
     def create_server(self, name, flavor_id, image_id, personality=None):
@@ -86,7 +133,7 @@ class ComputeClient(Client):
         if personality:
             req['server']['personality'] = personality
         
-        r = self.post(path4url('servers'), json=req, success=202)
+        r = self.servers_post(json_data=req)
         return r.json['server']
     
     def update_server_name(self, server_id, new_name):
@@ -95,90 +142,137 @@ class ComputeClient(Client):
         This call does not modify the hostname actually used by the server
         internally.
         """
-        path = path4url('servers', server_id)
         req = {'server': {'name': new_name}}
-        self.put(path, json=req, success=204)
+        self.servers_put(server_id, json_data=req)
     
     def delete_server(self, server_id):
         """Submit a deletion request for a server specified by id"""
-        path = path4url('servers', server_id)
-        self.delete(path, success=204)
+        self.servers_delete(server_id)
     
     def reboot_server(self, server_id, hard=False):
         """Submit a reboot request for a server specified by id"""
-        path = path4url('servers', server_id, 'action')
         type = 'HARD' if hard else 'SOFT'
         req = {'reboot': {'type': type}}
-        self.post(path, json=req, success=202)
+        self.servers_post(server_id, 'action', json_data=req)
     
-    def get_server_metadata(self, server_id, key=None):
-        path = path4url('servers', server_id, 'meta')
-        if key:
-            path = path4url(path, key)
-        r = self.get(path, success=200)
-        return r.json['meta'] if key else r.json['metadata']['values']
+    def get_server_metadata(self, server_id, key=''):
+        command = path4url('meta', key)
+        r = self.servers_get(server_id, command)
+        return r.json['meta'] if key != '' else r.json['metadata']['values']
     
     def create_server_metadata(self, server_id, key, val):
-        path = path4url('servers', server_id, 'meta', key)
+        command = path4url('meta', key)
         req = {'meta': {key: val}}
-        r = self.put(path, json=req, success=201)
+        r = self.servers_put(server_id, command, json_data=req, success=201)
         return r.json['meta']
     
     def update_server_metadata(self, server_id, **metadata):
-        path = path4url('servers', server_id, 'meta')
         req = {'metadata': metadata}
-        r = self.post(path, json=req, success=201)
+        r = self.servers_post(server_id, 'meta', json_data=req, success=201)
         return r.json['metadata']
     
     def delete_server_metadata(self, server_id, key):
-        path = path4url('servers', server_id, 'meta', key)
-        self.delete(path, success=204)
-    
-    
+        command = path4url('meta', key)
+        self.servers_delete(server_id, command)
+
+   
+    def flavors_get(self, flavor_id='', command='', **kwargs):
+        """GET base_url[/flavor_id][/command]
+        @param flavor_id
+        @param command
+        """
+        path = path4url('flavors', flavor_id, command)
+        success=kwargs.pop('success', 200)
+        return self.get(path, success=success**kwargs)
+
     def list_flavors(self, detail=False):
-        path = path4url('flavors', 'detail') if detail else path4url('flavors')
-        r = self.get(path, success=200)
+        detail = 'detail' if detail else ''
+        r.self.flavors_get(command='detail')
         return r.json['flavors']['values']
 
     def get_flavor_details(self, flavor_id):
-        path = path4url('flavors', flavor_id)
-        r = self.get(path, success=200)
+        r = self.flavors_get(flavor_id)
         return r.json['flavor']
     
-    
+
+    def images_get(self, image_id='', command='', **kwargs):
+        """GET base_url[/image_id][/command]
+        @param image_id
+        @param command
+        """
+        path = path4url('images', image_id, command)
+        success=kwargs.pop('success', 200)
+        return self.get(path, success=success**kwargs)
+
+    def images_delete(self, image_id='', command='', **kwargs):
+        """DEL ETE base_url[/image_id][/command]
+        @param image_id
+        @param command
+        """
+        path = path4url('images', image_id, command)
+        success=kwargs.pop('success', 204)
+        return self.delete(path, success=success**kwargs)
+
+    def images_post(self, image_id='', command='', json_data=None, **kwargs):
+        """POST base_url/images[/image_id]/[command] request
+        @param image_id or ''
+        @param command: can be 'action' or ''
+        @param json_data: a json valid dict that will be send as data
+        """
+        data = json_data
+        if json_data is not None:
+            data = json.dumps(json_data)
+            self.set_header('Content-Type', 'application/json')
+            self.set_header('Content-Length', len(data))
+
+        path = path4url('images', image_id, command)
+        success = kwargs.pop('success', 201)
+        return self.post(path, data=data, success=success, **kwargs)
+
+    def images_put(self, image_id='', command='', json_data=None, **kwargs):
+        """PUT base_url/images[/image_id]/[command] request
+        @param image_id or ''
+        @param command: can be 'action' or ''
+        @param json_data: a json valid dict that will be send as data
+        """
+        data = json_data
+        if json_data is not None:
+            data = json.dumps(json_data)
+            self.set_header('Content-Type', 'application/json')
+            self.set_header('Content-Length', len(data))
+
+        path = path4url('images', image_id, command)
+        success = kwargs.pop('success', 201)
+        return self.put(path, data=data, success=success, **kwargs)
+
     def list_images(self, detail=False):
-        path = path4url('images','detail') if detail else path4url('images')
-        r = self.get(path, success=200)
+        detail = 'detail' if details else ''
+        r = self.images_get(command=detail)
         return r.json['images']['values']
     
     def get_image_details(self, image_id):
-        path = path4url('images', image_id)
-        r = self.get(path, success=200)
+        r = self.images_get(image_id)
         return r.json['image']
     
     def delete_image(self, image_id):
-        path = path4url('images', image_id)
-        self.delete(path, success=204)
-
-    def get_image_metadata(self, image_id, key=None):
-        path = path4url('images', image_id, 'meta')
-        if key:
-            path = path4url(path, key)
-        r = self.get(path, success=200)
-        return r.json['meta'] if key else r.json['metadata']['values']
+        self.images_delete(image_id)
+
+    def get_image_metadata(self, image_id, key=''):
+        command = path4url('meta', key)
+        r = self.images_get(image_id, command)
+        return r.json['meta'] if key != '' else r.json['metadata']['values']
     
     def create_image_metadata(self, image_id, key, val):
-        path = path4url('images', image_id, 'meta', key)
+        command = path4url('meta', key)
         req = {'meta': {key: val}}
-        r = self.put(path, json=req, success=201)
+        r = self.images_put(image_id, command, json_data=req)
         return r.json['meta']
 
     def update_image_metadata(self, image_id, **metadata):
-        path = path4url('images', image_id, 'meta')
         req = {'metadata': metadata}
-        r = self.post(path, json=req, success=201)
+        r - self.images_post(image_id, 'meta', json_data=req)
         return r.json['metadata']
 
     def delete_image_metadata(self, image_id, key):
-        path = path4url('images', image_id, 'meta', key)
-        self.delete(path, success=204)
+        command = path4url('meta', key)
+        self.images_delete(image_id, command)
index 5905788..ab109da 100644 (file)
@@ -38,30 +38,6 @@ import json
 class CycladesClient(ComputeClient):
     """GRNet Cyclades API client"""
 
-    def servers_get(self, server_id='', command='', **kwargs):
-        """GET base_url/servers[/server_id][/command] request
-        @param server_id or ''
-        @param command: can be 'ips', 'stats', or ''
-        """
-        path = path4url('servers', server_id, command)
-        success = kwargs.pop('success', 200)
-        return self.get(path, success=success, **kwargs)
-
-    def servers_post(self, server_id='', command='', json_data=None, **kwargs):
-        """POST base_url/servers[/server_id]/[command] request
-        @param server_id or ''
-        @param command: can be 'action' or ''
-        @param json_data: a json valid dict that will be send as data
-        """
-        data = json_data
-        if json_data is not None:
-            data = json.dumps(json_data)
-            self.set_header('Content-Type', 'application/json')
-            self.set_header('Content-Length', len(data))
-
-        path = path4url('servers', server_id, command)
-        success = kwargs.pop('success', 202)
-        return self.post(path, data=data, success=success, **kwargs)
 
 
     def networks_get(self, network_id = '', command='', **kwargs):
@@ -187,7 +163,7 @@ class CycladesClient(ComputeClient):
         server_nets = self.list_server_nics(server_id)
         nets = [(net['id'],net['network_id'])  for net in server_nets if nic_id == net['id']]
         if len(nets) == 0:
-            continue
+            return
         for (nic_id, network_id) in nets:
             req={'remove':{'attachment':unicode(nic_id)}}
             self.networks_post(network_id, 'action', json_data=req)
index 3bd827a..86678cb 100644 (file)
@@ -58,16 +58,9 @@ class server_list(_init_cyclades):
             sname = server.pop('name')
             sid = server.pop('id')
             print('%s (%s)'%(bold(sname), bold(unicode(sid))))
-            if len(server)>0:
-                addr_dict = {}
-                if server.has_key('addresses'):
-                    for addr in server['addresses']['values']:
-                        ips = addr.pop('values', [])
-                        for ip in ips:
-                            addr['IPv%s'%ip['version']] = ip['addr']
-                        addr_dict[addr['name']] = addr
-                    server['addresses'] = addr_dict
-                print_dict(server, ident=12)
+            if getattr(self.args, 'detail'):
+                server_info.print_server(server)
+            print('- - -')
 
     def update_parser(self, parser):
         parser.add_argument('-l', dest='detail', action='store_true',
@@ -86,6 +79,21 @@ class server_list(_init_cyclades):
 class server_info(_init_cyclades):
     """Get server details"""
 
+    @classmethod
+    def print_server(self,server):
+        addr_dict = {}
+        if server.has_key('addresses'):
+            for addr in server['addresses']['values']:
+                ips = addr.pop('values', [])
+                for ip in ips:
+                    addr['IPv%s'%ip['version']] = ip['addr']
+                if addr.has_key('firewallProfile'):
+                    addr['firewall'] = addr.pop('firewallProfile')
+                addr_dict[addr['name']] = addr
+            server['addresses'] = addr_dict
+        print_dict(server, ident=14)
+
+
     def main(self, server_id):
         super(self.__class__, self).main()
         try:
@@ -95,7 +103,7 @@ class server_info(_init_cyclades):
         except ValueError as err:
             raise CLIError(message='Server id must be positive integer',
                 importance=1)
-        print_dict(server)
+        self.print_server(server)
 
 @command()
 class server_create(_init_cyclades):