Skip to content

Commit 0b50931

Browse files
authored
Merge branch 'main' into private_snat_rules_create
2 parents e5a36f9 + d5913da commit 0b50931

12 files changed

Lines changed: 131 additions & 2 deletions

File tree

doc/source/sdk/guides/privatenat.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,15 @@ the output with query parameters.
130130
.. literalinclude:: ../examples/natv3/list_private_snat_rules.py
131131
:lines: 16-23
132132

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
141+
133142
Create Private SNAT Rule
134143
^^^^^^^^^^^^^^^^^^^^^^^^
135144

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, create_private_dnat_rule, private_snat_rules, create_private_snat_rule
19+
:members: private_nat_gateways, get_private_nat_gateway, private_dnat_rules, get_private_dnat_rule, private_snat_rules, get_private_snat_rule, create_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: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,28 @@ def take_action(self, parsed_args):
198198
),
199199
)
200200

201+
202+
class ShowPrivateSnatRule(command.ShowOne):
203+
_description = _("Show private SNAT rule details.")
204+
205+
def get_parser(self, prog_name):
206+
parser = super(ShowPrivateSnatRule, self).get_parser(prog_name)
207+
parser.add_argument(
208+
"snat_rule",
209+
metavar="<snat_rule>",
210+
help=_("Specifies the private SNAT rule ID."),
211+
)
212+
return parser
213+
214+
def take_action(self, parsed_args):
215+
client = self.app.client_manager.privatenat
216+
obj = client.get_private_snat_rule(parsed_args.snat_rule)
217+
218+
display_columns, columns = _get_columns(obj)
219+
data = utils.get_item_properties(obj, columns)
220+
221+
return display_columns, data
222+
201223

202224
class CreatePrivateSnatRule(command.ShowOne):
203225

@@ -277,4 +299,3 @@ def take_action(self, parsed_args):
277299

278300
display_columns, columns = _get_columns(obj)
279301
data = utils.get_item_properties(obj, columns)
280-
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,7 +179,19 @@ 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.
182185
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)
194+
183195
def create_private_snat_rule(self, **attrs):
184196
"""Create a private SNAT rule from attributes.
185197

otcextensions/sdk/natv3/v3/snat.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class PrivateSnat(resource.Resource):
2828

2929
# capabilities
3030
allow_create = True
31+
allow_fetch = True
3132
allow_list = True
3233

3334
_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
@@ -131,6 +131,44 @@ def test_list_with_supported_filters(self):
131131
self.assertEqual(self.columns, columns)
132132
self.assertEqual(self.data, list(data))
133133

134+
135+
class TestShowPrivateSnatRule(fakes.TestPrivateNat):
136+
_data = fakes.FakePrivateSnatRule.create_one()
137+
138+
columns = (
139+
"cidr",
140+
"created_at",
141+
"description",
142+
"enterprise_project_id",
143+
"gateway_id",
144+
"id",
145+
"project_id",
146+
"status",
147+
"transit_ip_associations",
148+
"updated_at",
149+
"virsubnet_id",
150+
)
151+
152+
data = fakes.gen_data(_data, columns)
153+
154+
def setUp(self):
155+
super(TestShowPrivateSnatRule, self).setUp()
156+
157+
self.cmd = snat.ShowPrivateSnatRule(self.app, None)
158+
self.client.get_private_snat_rule = mock.Mock(return_value=self._data)
159+
160+
def test_show(self):
161+
arglist = [self._data.id]
162+
verifylist = [("snat_rule", self._data.id)]
163+
164+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
165+
columns, data = self.cmd.take_action(parsed_args)
166+
167+
self.client.get_private_snat_rule.assert_called_once_with(self._data.id)
168+
self.assertEqual(tuple(sorted(self.columns)), tuple(sorted(columns)))
169+
self.assertEqual(len(self.data), len(data))
170+
self.assertIn(self._data.id, data)
171+
134172

135173
class TestCreatePrivateSnatRule(fakes.TestPrivateNat):
136174
_data = fakes.FakePrivateSnatRule.create_one()

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,6 @@ def test_private_snat_rules(self):
7272

7373
def test_create_private_snat_rule(self):
7474
self.verify_create(self.proxy.create_private_snat_rule, snat.PrivateSnat)
75+
76+
def test_get_private_snat_rule(self):
77+
self.verify_get(self.proxy.get_private_snat_rule, snat.PrivateSnat)

0 commit comments

Comments
 (0)