From 27a0da65e37679bc042373d0e04ce88333d38a3b Mon Sep 17 00:00:00 2001
From: Tang Chen <chen.tang@easystack.cn>
Date: Wed, 10 Feb 2016 01:41:45 +0800
Subject: [PATCH] Support "network delete" command in nova network

"network delete" command is not implemented in nova network.
This patch implements it.

Change-Id: I5dac1eed6eb8e67298bb446418835a6ab85c859c
Depends-On: I1b59264cd40aaf1062f4e8db233ccb7fd0e95f0e
partial-Bug: 1543672
---
 doc/source/commands.rst                       |  2 +-
 openstackclient/network/v2/network.py         | 17 +++++--
 openstackclient/tests/compute/v2/fakes.py     |  4 ++
 .../tests/network/v2/test_network.py          | 47 +++++++++++++++++++
 4 files changed, 64 insertions(+), 6 deletions(-)

diff --git a/doc/source/commands.rst b/doc/source/commands.rst
index bf5d7035a9..6b862f816f 100644
--- a/doc/source/commands.rst
+++ b/doc/source/commands.rst
@@ -98,7 +98,7 @@ referring to both Compute and Volume quotas.
 * ``limits``: (**Compute**, **Volume**) resource usage limits
 * ``mapping``: (**Identity**) a definition to translate identity provider attributes to Identity concepts
 * ``module``: internal - installed Python modules in the OSC process
-* ``network``: (**Network**) - a virtual network for connecting servers and other resources
+* ``network``: (**Compute**, **Network**) - a virtual network for connecting servers and other resources
 * ``object``: (**Object Storage**) a single file in the Object Storage
 * ``policy``: (**Identity**) determines authorization
 * ``port``: (**Network**) - a virtual port for connecting servers and other resources to a network
diff --git a/openstackclient/network/v2/network.py b/openstackclient/network/v2/network.py
index 6123721963..ae80b48a15 100644
--- a/openstackclient/network/v2/network.py
+++ b/openstackclient/network/v2/network.py
@@ -17,6 +17,7 @@ from openstackclient.common import command
 from openstackclient.common import exceptions
 from openstackclient.common import utils
 from openstackclient.identity import common as identity_common
+from openstackclient.network import common
 
 
 def _format_admin_state(item):
@@ -141,11 +142,10 @@ class CreateNetwork(command.ShowOne):
         return (columns, data)
 
 
-class DeleteNetwork(command.Command):
+class DeleteNetwork(common.NetworkAndComputeCommand):
     """Delete network(s)"""
 
-    def get_parser(self, prog_name):
-        parser = super(DeleteNetwork, self).get_parser(prog_name)
+    def update_parser_common(self, parser):
         parser.add_argument(
             'network',
             metavar="<network>",
@@ -154,12 +154,19 @@ class DeleteNetwork(command.Command):
         )
         return parser
 
-    def take_action(self, parsed_args):
-        client = self.app.client_manager.network
+    def take_action_network(self, client, parsed_args):
         for network in parsed_args.network:
             obj = client.find_network(network)
             client.delete_network(obj)
 
+    def take_action_compute(self, client, parsed_args):
+        for network in parsed_args.network:
+            network = utils.find_resource(
+                client.networks,
+                network,
+            )
+            client.networks.delete(network.id)
+
 
 class ListNetwork(command.Lister):
     """List networks"""
diff --git a/openstackclient/tests/compute/v2/fakes.py b/openstackclient/tests/compute/v2/fakes.py
index 2e4cc1c56b..c5e8f412c2 100644
--- a/openstackclient/tests/compute/v2/fakes.py
+++ b/openstackclient/tests/compute/v2/fakes.py
@@ -90,6 +90,7 @@ class FakeComputev2Client(object):
     def __init__(self, **kwargs):
         self.aggregates = mock.Mock()
         self.aggregates.resource_class = fakes.FakeResource(None, {})
+
         self.availability_zones = mock.Mock()
         self.availability_zones.resource_class = fakes.FakeResource(None, {})
 
@@ -129,6 +130,9 @@ class FakeComputev2Client(object):
         self.floating_ips = mock.Mock()
         self.floating_ips.resource_class = fakes.FakeResource(None, {})
 
+        self.networks = mock.Mock()
+        self.networks.resource_class = fakes.FakeResource(None, {})
+
         self.auth_token = kwargs['token']
 
         self.management_url = kwargs['endpoint']
diff --git a/openstackclient/tests/network/v2/test_network.py b/openstackclient/tests/network/v2/test_network.py
index d6c6fbca2f..784a936653 100644
--- a/openstackclient/tests/network/v2/test_network.py
+++ b/openstackclient/tests/network/v2/test_network.py
@@ -17,6 +17,7 @@ import mock
 from openstackclient.common import exceptions
 from openstackclient.common import utils
 from openstackclient.network.v2 import network
+from openstackclient.tests.compute.v2 import fakes as compute_fakes
 from openstackclient.tests import fakes
 from openstackclient.tests.identity.v2_0 import fakes as identity_fakes_v2
 from openstackclient.tests.identity.v3 import fakes as identity_fakes_v3
@@ -24,6 +25,8 @@ from openstackclient.tests.network.v2 import fakes as network_fakes
 from openstackclient.tests import utils as tests_utils
 
 
+# Tests for Neutron network
+#
 class TestNetwork(network_fakes.TestNetworkV2):
 
     def setUp(self):
@@ -564,3 +567,47 @@ class TestShowNetwork(TestNetwork):
 
         self.assertEqual(tuple(self.columns), columns)
         self.assertEqual(list(self.data), list(data))
+
+
+# Tests for Nova network
+#
+class TestNetworkCompute(compute_fakes.TestComputev2):
+
+    def setUp(self):
+        super(TestNetworkCompute, self).setUp()
+
+        # Get a shortcut to the compute client
+        self.compute = self.app.client_manager.compute
+
+
+class TestDeleteNetworkCompute(TestNetworkCompute):
+
+    # The network to delete.
+    _network = network_fakes.FakeNetwork.create_one_network()
+
+    def setUp(self):
+        super(TestDeleteNetworkCompute, self).setUp()
+
+        self.app.client_manager.network_endpoint_enabled = False
+
+        self.compute.networks.delete.return_value = None
+
+        # Return value of utils.find_resource()
+        self.compute.networks.get.return_value = self._network
+
+        # Get the command object to test
+        self.cmd = network.DeleteNetwork(self.app, None)
+
+    def test_network_delete(self):
+        arglist = [
+            self._network.name,
+        ]
+        verifylist = [
+            ('network', [self._network.name]),
+        ]
+
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+        result = self.cmd.take_action(parsed_args)
+
+        self.compute.networks.delete.assert_called_with(self._network.id)
+        self.assertIsNone(result)