From 00c149a28f72ee7236e836a7f128fce9ca5e1e09 Mon Sep 17 00:00:00 2001
From: reedip <reedip.banerjee@nectechnologies.in>
Date: Tue, 19 Apr 2016 13:46:15 +0900
Subject: [PATCH] Add VLAN Transparent option to ``osc network``

osc network set and network create now support
--transparent-vlan|--no-transparent-vlan options
to add/remove vlan transparency from the network.

Change-Id: I845eb8f541cd32a4c4b28f929a63b205e7e31756
Closes-Bug: 1545537
---
 doc/source/command-objects/network.rst        | 22 +++++++++++++++++
 openstackclient/network/v2/network.py         | 24 +++++++++++++++----
 .../tests/network/v2/test_network.py          |  6 +++++
 ...n-transparent-option-4fa72fbfbbe3f31e.yaml |  9 +++++++
 4 files changed, 57 insertions(+), 4 deletions(-)
 create mode 100644 releasenotes/notes/add-vlan-transparent-option-4fa72fbfbbe3f31e.yaml

diff --git a/doc/source/command-objects/network.rst b/doc/source/command-objects/network.rst
index 5d534c59f5..bb8947e3d8 100644
--- a/doc/source/command-objects/network.rst
+++ b/doc/source/command-objects/network.rst
@@ -21,6 +21,7 @@ Create new network
         [--provider-network-type <provider-network-type>]
         [--provider-physical-network <provider-physical-network>]
         [--provider-segment <provider-segment>]
+        [--transparent-vlan | --no-transparent-vlan]
         <name>
 
 .. option:: --project <project>
@@ -116,6 +117,18 @@ Create new network
 
     *Network version 2 only*
 
+.. option:: --transparent-vlan
+
+    Make the network VLAN transparent
+
+    *Network version 2 only*
+
+.. option:: --no-transparent-vlan
+
+    Do not make the network VLAN transparent
+
+    *Network version 2 only*
+
 .. _network_create-name:
 .. describe:: <name>
 
@@ -175,6 +188,7 @@ Set network properties
         [--provider-network-type <provider-network-type>]
         [--provider-physical-network <provider-physical-network>]
         [--provider-segment <provider-segment>]
+        [--transparent-vlan | --no-transparent-vlan]
         <network>
 
 .. option:: --name <name>
@@ -227,6 +241,14 @@ Set network properties
 
     VLAN ID for VLAN networks or Tunnel ID for GRE/VXLAN networks
 
+.. option:: --transparent-vlan
+
+    Make the network VLAN transparent
+
+.. option:: --no-transparent-vlan
+
+    Do not make the network VLAN transparent
+
 .. _network_set-network:
 .. describe:: <network>
 
diff --git a/openstackclient/network/v2/network.py b/openstackclient/network/v2/network.py
index 4b77971a21..dab20b7459 100644
--- a/openstackclient/network/v2/network.py
+++ b/openstackclient/network/v2/network.py
@@ -93,11 +93,17 @@ def _get_attrs(client_manager, parsed_args):
         attrs['provider:physical_network'] = parsed_args.physical_network
     if parsed_args.segmentation_id:
         attrs['provider:segmentation_id'] = parsed_args.segmentation_id
+    # Update VLAN Transparency for networks
+    if parsed_args.transparent_vlan:
+        attrs['vlan_transparent'] = True
+    if parsed_args.no_transparent_vlan:
+        attrs['vlan_transparent'] = False
     return attrs
 
 
-def _add_provider_network_options(parser):
-    # Add provider network options
+def _add_additional_network_options(parser):
+    # Add additional network options
+
     parser.add_argument(
         '--provider-network-type',
         metavar='<provider-network-type>',
@@ -119,6 +125,16 @@ def _add_provider_network_options(parser):
         help=_("VLAN ID for VLAN networks or Tunnel ID for GRE/VXLAN "
                "networks"))
 
+    vlan_transparent_grp = parser.add_mutually_exclusive_group()
+    vlan_transparent_grp.add_argument(
+        '--transparent-vlan',
+        action='store_true',
+        help=_("Make the network VLAN transparent"))
+    vlan_transparent_grp.add_argument(
+        '--no-transparent-vlan',
+        action='store_true',
+        help=_("Do not make the network VLAN transparent"))
+
 
 def _get_attrs_compute(client_manager, parsed_args):
     attrs = {}
@@ -209,7 +225,7 @@ class CreateNetwork(common.NetworkAndComputeShowOne):
             help=_("Do not use the network as the default external network. "
                    "(default)")
         )
-        _add_provider_network_options(parser)
+        _add_additional_network_options(parser)
         return parser
 
     def update_parser_compute(self, parser):
@@ -413,7 +429,7 @@ class SetNetwork(command.Command):
             action='store_true',
             help=_("Do not use the network as the default external network")
         )
-        _add_provider_network_options(parser)
+        _add_additional_network_options(parser)
         return parser
 
     def take_action(self, parsed_args):
diff --git a/openstackclient/tests/network/v2/test_network.py b/openstackclient/tests/network/v2/test_network.py
index a1b0aec986..93450e23fd 100644
--- a/openstackclient/tests/network/v2/test_network.py
+++ b/openstackclient/tests/network/v2/test_network.py
@@ -149,6 +149,7 @@ class TestCreateNetworkIdentityV3(TestNetwork):
             "--provider-network-type", "vlan",
             "--provider-physical-network", "physnet1",
             "--provider-segment", "400",
+            "--transparent-vlan",
             self._network.name,
         ]
         verifylist = [
@@ -162,6 +163,7 @@ class TestCreateNetworkIdentityV3(TestNetwork):
             ('provider_network_type', 'vlan'),
             ('physical_network', 'physnet1'),
             ('segmentation_id', '400'),
+            ('transparent_vlan', True),
             ('name', self._network.name),
         ]
 
@@ -179,6 +181,7 @@ class TestCreateNetworkIdentityV3(TestNetwork):
             'provider:network_type': 'vlan',
             'provider:physical_network': 'physnet1',
             'provider:segmentation_id': '400',
+            'vlan_transparent': True,
         })
         self.assertEqual(self.columns, columns)
         self.assertEqual(self.data, data)
@@ -487,6 +490,7 @@ class TestSetNetwork(TestNetwork):
             '--provider-network-type', 'vlan',
             '--provider-physical-network', 'physnet1',
             '--provider-segment', '400',
+            '--no-transparent-vlan',
         ]
         verifylist = [
             ('network', self._network.name),
@@ -498,6 +502,7 @@ class TestSetNetwork(TestNetwork):
             ('provider_network_type', 'vlan'),
             ('physical_network', 'physnet1'),
             ('segmentation_id', '400'),
+            ('no_transparent_vlan', True),
         ]
 
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -512,6 +517,7 @@ class TestSetNetwork(TestNetwork):
             'provider:network_type': 'vlan',
             'provider:physical_network': 'physnet1',
             'provider:segmentation_id': '400',
+            'vlan_transparent': False,
         }
         self.network.update_network.assert_called_once_with(
             self._network, **attrs)
diff --git a/releasenotes/notes/add-vlan-transparent-option-4fa72fbfbbe3f31e.yaml b/releasenotes/notes/add-vlan-transparent-option-4fa72fbfbbe3f31e.yaml
new file mode 100644
index 0000000000..508fb81c7a
--- /dev/null
+++ b/releasenotes/notes/add-vlan-transparent-option-4fa72fbfbbe3f31e.yaml
@@ -0,0 +1,9 @@
+---
+features:
+  - |
+    ``network create`` and ``network set`` now support
+    ``--transparent-vlan`` and ``--no-transparent-vlan``
+    options to add/remove VLAN transparency attributes
+    from networks.
+    This option is available in Network V2 only.
+    [Bug `1545537 <https://bugs.launchpad.net/bugs/1545537>`_]
\ No newline at end of file