Skip to content

Commit d5913da

Browse files
authored
Add private snat get details (#651)
Add private snat get details Reviewed-by: Anton Sidelnikov
1 parent b419664 commit d5913da

12 files changed

Lines changed: 137 additions & 1 deletion

File tree

doc/source/sdk/guides/privatenat.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,12 @@ the output with query parameters.
129129

130130
.. literalinclude:: ../examples/natv3/list_private_snat_rules.py
131131
:lines: 16-23
132+
133+
Get Private SNAT Rule
134+
^^^^^^^^^^^^^^^^^^^^^
135+
136+
This interface is used to query details about a specified SNAT rule.
137+
:class:`~otcextensions.sdk.natv3.v3.snat.PrivateSnat`.
138+
139+
.. literalinclude:: ../examples/natv3/get_private_snat_rule.py
140+
:lines: 16-22

doc/source/sdk/proxies/privatenat.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ Private NAT Gateway Operations
1616

1717
.. autoclass:: otcextensions.sdk.natv3.v3._proxy.Proxy
1818
:noindex:
19-
:members: private_nat_gateways, get_private_nat_gateway, private_dnat_rules, private_snat_rules
19+
:members: private_nat_gateways, get_private_nat_gateway, private_dnat_rules, get_private_dnat_rule, private_snat_rules, get_private_snat_rule
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#!/usr/bin/env python3
2+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
3+
# not use this file except in compliance with the License. You may obtain
4+
# a copy of the License at
5+
#
6+
# http://www.apache.org/licenses/LICENSE-2.0
7+
#
8+
# Unless required by applicable law or agreed to in writing, software
9+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
10+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
11+
# License for the specific language governing permissions and limitations
12+
# under the License.
13+
"""
14+
Get Private SNAT Rule Details
15+
"""
16+
17+
import openstack
18+
19+
openstack.enable_logging(True)
20+
conn = openstack.connect(cloud="otc")
21+
22+
snat_rule = conn.natv3.get_private_snat_rule("snat_rule_id")
23+
print(snat_rule)

otcextensions/osclient/privatenat/v3/snat.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,17 @@
1717
from osc_lib import utils
1818
from osc_lib.command import command
1919

20+
from otcextensions.common import sdk_utils
2021
from otcextensions.i18n import _
2122

2223
LOG = logging.getLogger(__name__)
2324

2425

26+
def _get_columns(item):
27+
column_map = {}
28+
return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map)
29+
30+
2531
def _get_transit_ip_addresses(rule):
2632
return ", ".join(
2733
association.transit_ip_address
@@ -190,3 +196,25 @@ def take_action(self, parsed_args):
190196
for s in data
191197
),
192198
)
199+
200+
201+
class ShowPrivateSnatRule(command.ShowOne):
202+
_description = _("Show private SNAT rule details.")
203+
204+
def get_parser(self, prog_name):
205+
parser = super(ShowPrivateSnatRule, self).get_parser(prog_name)
206+
parser.add_argument(
207+
"snat_rule",
208+
metavar="<snat_rule>",
209+
help=_("Specifies the private SNAT rule ID."),
210+
)
211+
return parser
212+
213+
def take_action(self, parsed_args):
214+
client = self.app.client_manager.privatenat
215+
obj = client.get_private_snat_rule(parsed_args.snat_rule)
216+
217+
display_columns, columns = _get_columns(obj)
218+
data = utils.get_item_properties(obj, columns)
219+
220+
return display_columns, data

otcextensions/sdk/natv3/v3/_proxy.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,3 +179,15 @@ def private_snat_rules(self, **query):
179179
:class:`~otcextensions.sdk.natv3.v3.snat.PrivateSnat`
180180
"""
181181
return self._list(_snat.PrivateSnat, **query)
182+
183+
def get_private_snat_rule(self, snat_rule):
184+
"""Get a single private SNAT rule.
185+
186+
:param snat_rule: The value can be the ID of a private SNAT rule.
187+
188+
:returns: One :class:`~otcextensions.sdk.natv3.v3.snat.PrivateSnat`
189+
190+
:raises: :class:`~openstack.exceptions.ResourceNotFound`
191+
when no resource can be found.
192+
"""
193+
return self._get(_snat.PrivateSnat, snat_rule)

otcextensions/sdk/natv3/v3/snat.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class PrivateSnat(resource.Resource):
2727
base_path = "/private-nat/snat-rules"
2828

2929
# capabilities
30+
allow_fetch = True
3031
allow_list = True
3132

3233
_query_mapping = resource.QueryParameters(

otcextensions/tests/functional/osclient/privatenat/v3/test_private_snat.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,15 @@ def setUp(self):
2424
def test_privatenat_snat_rule_list(self):
2525
json_output = json.loads(self.openstack("privatenat snat rule list -f json "))
2626
self.assertIsNotNone(json_output)
27+
28+
def test_privatenat_snat_rule_show(self):
29+
json_output = json.loads(self.openstack("privatenat snat rule list -f json "))
30+
if not json_output:
31+
self.skipTest("No private SNAT rules available for show test")
32+
33+
snat_rule_id = json_output[0]["id"]
34+
json_output = json.loads(
35+
self.openstack("privatenat snat rule show -f json " + snat_rule_id)
36+
)
37+
self.assertIsNotNone(json_output)
38+
self.assertEqual(json_output["id"], snat_rule_id)

otcextensions/tests/functional/sdk/natv3/v3/test_private_snat.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,11 @@ class TestPrivateSnat(base.BaseFunctionalTest):
2121
def test_list_snat_rules(self):
2222
snat_rules = list(self.conn.natv3.private_snat_rules())
2323
self.assertGreaterEqual(len(snat_rules), 0)
24+
25+
def test_get_private_snat_rule(self):
26+
snat_rules = list(self.conn.natv3.private_snat_rules(limit=1))
27+
if not snat_rules:
28+
self.skipTest("No private SNAT rules available for fetch test")
29+
30+
snat_rule = self.conn.natv3.get_private_snat_rule(snat_rules[0].id)
31+
self.assertEqual(snat_rule.id, snat_rules[0].id)

otcextensions/tests/unit/osclient/privatenat/v3/test_snat.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,3 +128,41 @@ def test_list_with_supported_filters(self):
128128
)
129129
self.assertEqual(self.columns, columns)
130130
self.assertEqual(self.data, list(data))
131+
132+
133+
class TestShowPrivateSnatRule(fakes.TestPrivateNat):
134+
_data = fakes.FakePrivateSnatRule.create_one()
135+
136+
columns = (
137+
"cidr",
138+
"created_at",
139+
"description",
140+
"enterprise_project_id",
141+
"gateway_id",
142+
"id",
143+
"project_id",
144+
"status",
145+
"transit_ip_associations",
146+
"updated_at",
147+
"virsubnet_id",
148+
)
149+
150+
data = fakes.gen_data(_data, columns)
151+
152+
def setUp(self):
153+
super(TestShowPrivateSnatRule, self).setUp()
154+
155+
self.cmd = snat.ShowPrivateSnatRule(self.app, None)
156+
self.client.get_private_snat_rule = mock.Mock(return_value=self._data)
157+
158+
def test_show(self):
159+
arglist = [self._data.id]
160+
verifylist = [("snat_rule", self._data.id)]
161+
162+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
163+
columns, data = self.cmd.take_action(parsed_args)
164+
165+
self.client.get_private_snat_rule.assert_called_once_with(self._data.id)
166+
self.assertEqual(tuple(sorted(self.columns)), tuple(sorted(columns)))
167+
self.assertEqual(len(self.data), len(data))
168+
self.assertIn(self._data.id, data)

otcextensions/tests/unit/sdk/natv3/v3/test_proxy.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,6 @@ class TestPrivateSnat(TestNatv3Proxy):
6969

7070
def test_private_snat_rules(self):
7171
self.verify_list(self.proxy.private_snat_rules, snat.PrivateSnat)
72+
73+
def test_get_private_snat_rule(self):
74+
self.verify_get(self.proxy.get_private_snat_rule, snat.PrivateSnat)

0 commit comments

Comments
 (0)