Create port_creates extention (cyclaes) and expose
authorStavros Sachtouris <saxtouri@admin.grnet.gr>
Thu, 7 Nov 2013 10:41:32 +0000 (12:41 +0200)
committerStavros Sachtouris <saxtouri@admin.grnet.gr>
Thu, 7 Nov 2013 10:41:32 +0000 (12:41 +0200)
Refs: #4563

kamaki/cli/commands/network.py
kamaki/clients/cyclades/__init__.py
kamaki/clients/cyclades/test.py

index 9fe7b0a..922a690 100644 (file)
@@ -436,6 +436,24 @@ class port_set(_init_network, _optional_json):
         self._run(port_id=port_id)
 
 
-#@command(port_cmds)
-#class port_create(_init_network, _optional_json):
-#
+@command(port_cmds)
+class port_create(_init_network, _optional_json):
+    """Create a new port"""
+
+    arguments = dict(
+        security_group_id=RepeatableArgument(
+            'Add a security group id (can be repeated)',
+            ('-g', '--security-group'))
+    )
+
+    @errors.generic.all
+    @errors.cyclades.connection
+    @errors.cyclades.network_id
+    def _run(self, network_id, device_id):
+        r = self.client.create_port(
+            network_id, device_id, security_groups=self['security_group_id'])
+        self._print(r, self.print_dict)
+
+    def main(self, network_id, device_id):
+        super(self.__class__, self)._run()
+        self._run(network_id=network_id, device_id=device_id)
index a6fb717..3cb2316 100644 (file)
@@ -525,3 +525,10 @@ class CycladesNetworkClient(NetworkClient):
             req['network']['shared'] = bool(shared)
         r = self.networks_post(json_data=req, success=201)
         return r.json['network']
+
+    def create_port(self, network_id, device_id, security_groups=None):
+        port = dict(network_id=network_id, device_id=device_id)
+        if security_groups:
+            port['security_groups'] = security_groups
+        r = self.ports_post(json_data=dict(port=port), success=201)
+        return r.json['port']
index 588d22e..415e9c9 100644 (file)
@@ -277,6 +277,22 @@ class CycladesNetworkClient(TestCase):
             expargs = dict(json_data=dict(network=req), success=201)
             self.assertEqual(networks_post.mock_calls[-1], call(**expargs))
 
+    @patch(
+        'kamaki.clients.network.rest_api.NetworkRestClient.ports_post',
+        return_value=FR)
+    def test_create_port(self, ports_post):
+        network_id, device_id, FR.json = 'netid', 'devid', dict(port='ret v')
+        for security_groups in ([1, 2, 3], None):
+            self.assertEqual(
+                self.client.create_port(
+                    network_id, device_id, security_groups=security_groups),
+                'ret v')
+            req = dict(network_id=network_id, device_id=device_id)
+            if security_groups:
+                req['security_groups'] = security_groups
+            expargs = dict(json_data=dict(port=req), success=201)
+            self.assertEqual(ports_post.mock_calls[-1], call(**expargs))
+
 
 class CycladesClient(TestCase):