Fixed and modified disconnect network
authorStavros Sachtouris <saxtouri@admin.grnet.gr>
Tue, 17 Jul 2012 16:12:45 +0000 (19:12 +0300)
committerStavros Sachtouris <saxtouri@admin.grnet.gr>
Tue, 17 Jul 2012 16:12:45 +0000 (19:12 +0300)
Fixed bug with return value
Modified disconnect to take only nic_id as arg

kamaki/cli.py
kamaki/clients/compute.py
kamaki/clients/cyclades.py

index 4ef554d..8a73631 100755 (executable)
@@ -571,11 +571,14 @@ class network_connect(object):
 
 @command(api='cyclades')
 class network_disconnect(object):
-    """Disconnect a server from a network"""
-
-    def main(self, server_id, network_id):
-        self.client.disconnect_server(server_id, network_id)
+    """Disconnect a nic that connects a server to a network"""
 
+    def main(self, nic_id):
+        try:
+            server_id = nic_id.split('-')[1]
+            self.client.disconnect_server(server_id, nic_id)
+        except IndexError:
+            print('nid_id format: nic-<server_id>-<nic_index>')
 
 @command(api='image')
 class image_public(object):
index e87590f..39e1a38 100644 (file)
@@ -39,11 +39,15 @@ class ComputeClient(Client):
     """OpenStack Compute API 1.1 client"""
     
     def raise_for_status(self, r):
-        d = r.json
-        key = d.keys()[0]
-        val = d[key]
-        message = '%s: %s' % (key, val.get('message', ''))
-        details = val.get('details', '')
+        try:
+            d = r.json
+            key = d.keys()[0]
+            val = d[key]
+            message = '%s: %s' % (key, val.get('message', ''))
+            details = val.get('details', '')
+        except AttributeError:
+            message = 'Request responded with error code '+unicode(r.status_code)
+            details = unicode(r.request.method)+' '+unicode(r.url)
         raise ClientError(message, r.status_code, details)
     
     def list_servers(self, detail=False):
index a3aa03b..c71f4f6 100644 (file)
@@ -69,15 +69,10 @@ class CycladesClient(ComputeClient):
         req = {'firewallProfile': {'profile': profile}}
         self.post(path, json=req, success=202)
     
-    def list_server_nic_details(self, server_id, network=None):
+    def list_server_nics(self, server_id):
         path = path4url('servers', server_id, 'ips')
-        if network:
-            path += path4url(network)
         r = self.get(path, success=200)
-        if network:
-            return [r.json['network']]
-        else:
-            return r.json['attachments']['values']
+        return r.json['addresses']['values']
     
     def get_server_stats(self, server_id):
         path = path4url('servers', server_id, 'stats')
@@ -124,9 +119,12 @@ class CycladesClient(ComputeClient):
         req = {'add': {'serverRef': server_id}}
         self.post(path, json=req, success=202)
 
-    def disconnect_server(self, server_id, network_id):
-        matched_nets = [net for net in self.list_server_nic_details(server_id) if net['network_id'] == network_id]
-        path = path4url('networks', network_id, 'action')
-        for nic in matched_nets:
-            req = {'remove': {'attachment': unicode(nic['id'])}}
+    def disconnect_server(self, server_id, nic_id):
+        server_nets = self.list_server_nics(server_id)
+        nets = [(net['id'],net['network_id'])  for net in server_nets if nic_id == net['id']]
+        print('Found:'+unicode(nets))
+        for (nic_id, network_id) in nets:
+            print('\n\n\nNow i am willing to DESTROY nic %s of net %s\n\n\n' % (nic_id, network_id))
+            path = path4url('networks', network_id, 'action')
+            req = dict(remove=dict(attachment=unicode(nic_id)))
             self.post(path, json=req, success=202)