Compare commits

..

24 Commits

Author SHA1 Message Date
690bb97d9d Update master for stable/2025.1
Add file to the reno documentation build to show release notes for
stable/2025.1.

Use pbr instruction to increment the minor version number
automatically so that master versions are higher than the versions on
stable/2025.1.

Sem-Ver: feature
Change-Id: Ia1fb8c591c315404d4e758a657a4b35fe523dfff
2025-03-06 09:16:53 +00:00
Zuul
7d998d2525 Merge "Remove unnecessary direct dependency on iso8601" 2025-03-03 20:57:35 +00:00
Takashi Kajinami
370bd215c7 Remove unnecessary direct dependency on iso8601
Direct dependency on the library was removed by [1].

[1] 9c464ba53f

Change-Id: Id24f85b68c42977cb3f34c66934238a16e03a79c
2025-03-01 01:11:16 +09:00
Bodo Petermann
dc026cd3d6 vpnaas: add support for more ciphers (auth, encryption, pfs modes)
Extend the lists of choices for encryption algorithms, auth algorithms,
and PFS groups to include the additions made in neutron-vpnaas.

Encryption algorithms: add AES CCM mode and AES GCM mode variants
for 128/192/256 bit keys and 8/12/16 octet ICVs, add AES CTR modes
for 128/192/256 bit keys
Auth algorithms: add aes-xcbc and aes-cmac.
PFS: add Diffie Hellman groups 15 to 31.

Related-Bug: #1938284
Change-Id: I3fd17b93820da9d86b2fc4bc89058475d7629d5d
2025-02-26 16:02:25 +01:00
Zuul
1d7a13ab11 Merge "vpnaas: show external_vx_ip for vpn service show" 2024-11-20 17:34:37 +00:00
636ac764d3 reno: Update master for unmaintained/2023.1
Update the 2023.1 release notes configuration to build from
unmaintained/2023.1.

Change-Id: Id69fb2c2e197e91d679473c52f556e378fa3ba1e
2024-11-14 10:35:43 +00:00
elajkat
b2107dc867 vpnaas: show external_vx_ip for vpn service show
Closes-Bug: #2086144
Change-Id: Ic8ae85ee62e35991e8bb0096cdc6785a0b04e545
2024-11-08 09:02:34 +01:00
Zuul
75e112bc9b Merge "Drop unused tempest from test requirements" 2024-11-04 20:43:19 +00:00
Zuul
1befb3cd08 Merge "tox: Drop envdir" 2024-10-30 10:50:03 +00:00
Takashi Kajinami
f882f1ddb6 Remove Python 3.8 support
Python 3.8 was removed from the tested runtimes for 2024.2[1] and has
not been tested since then.

Also add a few newer versions which are part of the tested runtimes for
2025.1.

[1] https://governance.openstack.org/tc/reference/runtimes/2024.2.html

Change-Id: Ic0c05be1ce22dc2a5c67c6eb2b215d50d57ff116
2024-10-24 21:19:15 +09:00
Takashi Kajinami
8a2f07683b tox: Drop envdir
tox now always recreates an env although the env is shared using envdir
options.
~~~
$ tox -e genpolicy
genpolicy: recreate env because env type changed from
{'name': 'genconfig', 'type': 'VirtualEnvRunner'} to
{'name': 'genpolicy', 'type': 'VirtualEnvRunner'}
~~~

According to the maintainer of tox, this functionality is not intended
to be supported.
https://github.com/tox-dev/tox/issues/425#issuecomment-1011944293

Change-Id: I496d3ffe65be13df80c29ac4582596be0aa4d909
2024-10-13 01:30:39 +09:00
Takashi Kajinami
5438377b9c Drop unused tempest from test requirements
None of the tests implemented in this repository depend on tempest.

In addition testscenarios is not used either, and can be removed.

Change-Id: I642f8a5093a6e2b5528e446a798270734c4ed30d
2024-10-12 00:06:07 +09:00
d36a8a4a17 Update master for stable/2024.2
Add file to the reno documentation build to show release notes for
stable/2024.2.

Use pbr instruction to increment the minor version number
automatically so that master versions are higher than the versions on
stable/2024.2.

Sem-Ver: feature
Change-Id: I02c3547991a272afcc3a8902476949cd0bd1ce74
2024-09-05 16:02:19 +00:00
Zuul
a10390c62e Merge "Fix insert and remove rule from firewall policy" 2024-05-20 11:19:44 +00:00
Valentin Chassignol
cb9aae55c8 BGPVPN: Fix resource comparison
This patch updates the resource comparison to accurately differentiate
between the manipulation of networks, ports, and router associations.
Introduced in I84fe4bb45d24c2f4a7a0246e2b9fb50354a715e0, the previous
implementation contained incorrect variable names, leading to
inconsistent results. This fix ensures that each resource type is
properly identified during comparison.

Closes-Bug: #2064286
Change-Id: Ieb87174296240f8f76ec10b39007935545b1bd3f
2024-05-06 14:22:08 +00:00
fb8de782bc reno: Update master for unmaintained/zed
Update the zed release notes configuration to build from
unmaintained/zed.

Change-Id: I73aa32050dfaa378dd7455846e994560851c0e54
2024-04-30 08:54:59 +00:00
Benjamin Reichel
2169b2bbab Fix insert and remove rule from firewall policy
This change fixes the incompatability with the openstacksdk
for inserting and removing rules from firewall policiese.

Closes-Bug: #2057816
Change-Id: I8db7b4cc61b810887b0a675efa562f089821e8ec
2024-04-12 10:42:12 +02:00
Zuul
111713fd62 Merge "reno: Update master for unmaintained/victoria" 2024-04-02 18:36:50 +00:00
Zuul
98d8d8b5cd Merge "reno: Update master for unmaintained/wallaby" 2024-04-02 18:36:08 +00:00
Zuul
1cdac483be Merge "reno: Update master for unmaintained/xena" 2024-04-02 18:34:58 +00:00
fe515adf35 Update master for stable/2024.1
Add file to the reno documentation build to show release notes for
stable/2024.1.

Use pbr instruction to increment the minor version number
automatically so that master versions are higher than the versions on
stable/2024.1.

Sem-Ver: feature
Change-Id: I074213d853338f1e087b59f14f3c66ea449e5536
2024-03-07 15:38:58 +00:00
41e7ea6e29 reno: Update master for unmaintained/xena
Update the xena release notes configuration to build from
unmaintained/xena.

Change-Id: I074395b7079588a5dd2f6188a04b5d48b10e124b
2024-03-06 12:21:58 +00:00
863c6031fc reno: Update master for unmaintained/wallaby
Update the wallaby release notes configuration to build from
unmaintained/wallaby.

Change-Id: Ia81995fae56aef0951004ab1c7340a38f24a66f0
2024-03-06 12:14:08 +00:00
750afa1777 reno: Update master for unmaintained/victoria
Update the victoria release notes configuration to build from
unmaintained/victoria.

Change-Id: I27ad08ec3327a9a9984223f7d9319129537040e4
2024-03-06 12:04:19 +00:00
22 changed files with 197 additions and 41 deletions

View File

@@ -235,7 +235,7 @@ class FirewallPolicyInsertRule(command.Command):
policy_id = client.find_firewall_policy(
parsed_args.firewall_policy)['id']
body = self.args2body(parsed_args)
client.insert_rule_into_policy(policy_id, body)
client.insert_rule_into_policy(policy_id, **body)
rule_id = body['firewall_rule_id']
policy = parsed_args.firewall_policy
print((_('Inserted firewall rule %(rule)s in firewall policy '
@@ -264,7 +264,7 @@ class FirewallPolicyRemoveRule(command.Command):
parsed_args.firewall_policy)['id']
fwr_id = _get_required_firewall_rule(client, parsed_args)
body = {'firewall_rule_id': fwr_id}
client.remove_rule_from_policy(policy_id, body)
client.remove_rule_from_policy(policy_id, **body)
rule_id = body['firewall_rule_id']
policy = parsed_args.firewall_policy
print((_('Removed firewall rule %(rule)s from firewall policy '

View File

@@ -75,10 +75,10 @@ class CreateBgpvpnResAssoc(command.ShowOne):
body.update(
arg2body(bgpvpn['id'], parsed_args))
if self._assoc_res_name == constants.NETWORK_ASSOC:
if self._resource == constants.NETWORK_ASSOC:
obj = client.create_bgpvpn_network_association(
bgpvpn['id'], **body)
elif self._assoc_res_name == constants.PORT_ASSOCS:
elif self._resource == constants.PORT_ASSOC:
obj = client.create_bgpvpn_port_association(bgpvpn['id'], **body)
else:
obj = client.create_bgpvpn_router_association(
@@ -123,10 +123,10 @@ class SetBgpvpnResAssoc(command.Command):
arg2body = getattr(self, '_args2body', None)
if callable(arg2body):
body = arg2body(bgpvpn['id'], parsed_args)
if self._assoc_res_name == constants.NETWORK_ASSOC:
if self._resource == constants.NETWORK_ASSOC:
client.update_bgpvpn_network_association(
bgpvpn['id'], parsed_args.resource_association_id, **body)
elif self._assoc_res_name == constants.PORT_ASSOCS:
elif self._resource == constants.PORT_ASSOC:
client.update_bgpvpn_port_association(
bgpvpn['id'], parsed_args.resource_association_id, **body)
else:
@@ -165,9 +165,9 @@ class DeleteBgpvpnResAssoc(command.Command):
fails = 0
for id in parsed_args.resource_association_ids:
try:
if self._assoc_res_name == constants.NETWORK_ASSOC:
if self._resource == constants.NETWORK_ASSOC:
client.delete_bgpvpn_network_association(bgpvpn['id'], id)
elif self._assoc_res_name == constants.PORT_ASSOCS:
elif self._resource == constants.PORT_ASSOC:
client.delete_bgpvpn_port_association(bgpvpn['id'], id)
else:
client.delete_bgpvpn_router_association(bgpvpn['id'], id)
@@ -221,10 +221,10 @@ class ListBgpvpnResAssoc(command.Lister):
params = {}
if parsed_args.property:
params.update(parsed_args.property)
if self._assoc_res_name == constants.NETWORK_ASSOC:
if self._resource == constants.NETWORK_ASSOC:
objs = client.bgpvpn_network_associations(
bgpvpn['id'], retrieve_all=True, **params)
elif self._assoc_res_name == constants.PORT_ASSOCS:
elif self._resource == constants.PORT_ASSOC:
objs = client.bgpvpn_port_associations(
bgpvpn['id'], retrieve_all=True, **params)
else:
@@ -265,10 +265,10 @@ class ShowBgpvpnResAssoc(command.ShowOne):
def take_action(self, parsed_args):
client = self.app.client_manager.network
bgpvpn = client.find_bgpvpn(parsed_args.bgpvpn)
if self._assoc_res_name == constants.NETWORK_ASSOC:
if self._resource == constants.NETWORK_ASSOC:
obj = client.get_bgpvpn_network_association(
bgpvpn['id'], parsed_args.resource_association_id)
elif self._assoc_res_name == constants.PORT_ASSOCS:
elif self._resource == constants.PORT_ASSOC:
obj = client.get_bgpvpn_port_association(
bgpvpn['id'], parsed_args.resource_association_id)
else:

View File

@@ -56,6 +56,66 @@ _attr_map_dict = {
'project_id': 'Project',
}
_auth_algorithms = [
'sha1',
'sha256',
'sha384',
'sha512',
'aes-xcbc',
'aes-cmac',
]
_encryption_algorithms = [
'3des',
'aes-128',
'aes-192',
'aes-256',
'aes-128-ccm-8',
'aes-192-ccm-8',
'aes-256-ccm-8',
'aes-128-ccm-12',
'aes-192-ccm-12',
'aes-256-ccm-12',
'aes-128-ccm-16',
'aes-192-ccm-16',
'aes-256-ccm-16',
'aes-128-gcm-8',
'aes-192-gcm-8',
'aes-256-gcm-8',
'aes-128-gcm-12',
'aes-192-gcm-12',
'aes-256-gcm-12',
'aes-128-gcm-16',
'aes-192-gcm-16',
'aes-256-gcm-16',
'aes-128-ctr',
'aes-192-ctr',
'aes-256-ctr',
]
_pfs_groups = [
'group2',
'group5',
'group14',
'group15',
'group16',
'group17',
'group18',
'group19',
'group20',
'group21',
'group22',
'group23',
'group24',
'group25',
'group26',
'group27',
'group28',
'group29',
'group30',
'group31',
]
def _convert_to_lowercase(string):
return string.lower()
@@ -68,12 +128,12 @@ def _get_common_parser(parser):
help=_('Description of the IKE policy'))
parser.add_argument(
'--auth-algorithm',
choices=['sha1', 'sha256', 'sha384', 'sha512'],
choices=_auth_algorithms,
type=_convert_to_lowercase,
help=_('Authentication algorithm'))
parser.add_argument(
'--encryption-algorithm',
choices=['aes-128', '3des', 'aes-192', 'aes-256'],
choices=_encryption_algorithms,
type=_convert_to_lowercase,
help=_('Encryption algorithm'))
parser.add_argument(
@@ -88,7 +148,7 @@ def _get_common_parser(parser):
help=_('IKE version for the policy'))
parser.add_argument(
'--pfs',
choices=['group5', 'group2', 'group14'],
choices=_pfs_groups,
type=_convert_to_lowercase,
help=_('Perfect Forward Secrecy'))
parser.add_argument(

View File

@@ -54,6 +54,66 @@ _attr_map_dict = {
'project_id': 'Project',
}
_auth_algorithms = [
'sha1',
'sha256',
'sha384',
'sha512',
'aes-xcbc',
'aes-cmac',
]
_encryption_algorithms = [
'3des',
'aes-128',
'aes-192',
'aes-256',
'aes-128-ccm-8',
'aes-192-ccm-8',
'aes-256-ccm-8',
'aes-128-ccm-12',
'aes-192-ccm-12',
'aes-256-ccm-12',
'aes-128-ccm-16',
'aes-192-ccm-16',
'aes-256-ccm-16',
'aes-128-gcm-8',
'aes-192-gcm-8',
'aes-256-gcm-8',
'aes-128-gcm-12',
'aes-192-gcm-12',
'aes-256-gcm-12',
'aes-128-gcm-16',
'aes-192-gcm-16',
'aes-256-gcm-16',
'aes-128-ctr',
'aes-192-ctr',
'aes-256-ctr',
]
_pfs_groups = [
'group2',
'group5',
'group14',
'group15',
'group16',
'group17',
'group18',
'group19',
'group20',
'group21',
'group22',
'group23',
'group24',
'group25',
'group26',
'group27',
'group28',
'group29',
'group30',
'group31',
]
def _convert_to_lowercase(string):
return string.lower()
@@ -66,7 +126,7 @@ def _get_common_parser(parser):
help=_('Description of the IPsec policy'))
parser.add_argument(
'--auth-algorithm',
choices=['sha1', 'sha256', 'sha384', 'sha512'],
choices=_auth_algorithms,
type=_convert_to_lowercase,
help=_('Authentication algorithm for IPsec policy'))
parser.add_argument(
@@ -76,7 +136,7 @@ def _get_common_parser(parser):
help=_('Encapsulation mode for IPsec policy'))
parser.add_argument(
'--encryption-algorithm',
choices=['3des', 'aes-128', 'aes-192', 'aes-256'],
choices=_encryption_algorithms,
type=_convert_to_lowercase,
help=_('Encryption algorithm for IPsec policy'))
parser.add_argument(
@@ -86,7 +146,7 @@ def _get_common_parser(parser):
help=vpn_utils.lifetime_help("IPsec"))
parser.add_argument(
'--pfs',
choices=['group2', 'group5', 'group14'],
choices=_pfs_groups,
type=_convert_to_lowercase,
help=_('Perfect Forward Secrecy for IPsec policy'))
parser.add_argument(

View File

@@ -36,6 +36,8 @@ _attr_map = (
('status', 'Status', column_util.LIST_BOTH),
('description', 'Description', column_util.LIST_LONG_ONLY),
('project_id', 'Project', column_util.LIST_LONG_ONLY),
('external_v4_ip', 'Ext v4 IP', column_util.LIST_LONG_ONLY),
('external_v6_ip', 'Ext v6 IP', column_util.LIST_LONG_ONLY),
)
_attr_map_dict = {
@@ -48,6 +50,8 @@ _attr_map_dict = {
'status': 'Status',
'description': 'Description',
'project_id': 'Project',
'external_v4_ip': 'Ext v4 IP',
'external_v6_ip': 'Ext v6 IP',
}
@@ -135,8 +139,7 @@ class CreateVPNService(command.ShowOne):
attrs['router_id'] = _router_id
obj = client.create_vpn_service(**attrs)
display_columns, columns = utils.get_osc_show_columns_for_sdk_resource(
obj, _attr_map_dict, ['location', 'tenant_id', 'external_v4_ip',
'external_v6_ip'])
obj, _attr_map_dict, ['location', 'tenant_id'])
data = utils.get_dict_properties(obj, columns)
return display_columns, data
@@ -244,7 +247,6 @@ class ShowVPNService(command.ShowOne):
ignore_missing=False)['id']
obj = client.get_vpn_service(vpn_id)
display_columns, columns = utils.get_osc_show_columns_for_sdk_resource(
obj, _attr_map_dict, ['location', 'tenant_id', 'external_v4_ip',
'external_v6_ip'])
obj, _attr_map_dict, ['location', 'tenant_id'])
data = utils.get_dict_properties(obj, columns)
return (display_columns, data)

View File

@@ -507,12 +507,12 @@ class TestFirewallPolicyInsertRule(TestFirewallPolicy):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.mocked.assert_called_once_with(
target, {
'firewall_rule_id': rule,
'insert_before': before,
'insert_after': after
})
body = {
'firewall_rule_id': rule,
'insert_before': before,
'insert_after': after
}
self.mocked.assert_called_once_with(target, **body)
self.assertIsNone(result)
self.assertEqual(1, self.networkclient.find_firewall_policy.call_count)
self.assertEqual(3, self.networkclient.find_firewall_rule.call_count)
@@ -560,8 +560,8 @@ class TestFirewallPolicyRemoveRule(TestFirewallPolicy):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.mocked.assert_called_once_with(
target, {'firewall_rule_id': rule})
body = {'firewall_rule_id': rule}
self.mocked.assert_called_once_with(target, **body)
self.assertIsNone(result)
self.assertEqual(1, self.networkclient.find_firewall_policy.call_count)
self.assertEqual(1, self.networkclient.find_firewall_rule.call_count)

View File

@@ -125,6 +125,8 @@ class VPNService(FakeVPNaaS):
('status', 'ACTIVE'),
('description', 'my-desc-' + uuid.uuid4().hex),
('project_id', 'project-id-' + uuid.uuid4().hex),
('external_v4_ip', '192.0.2.42'),
('external_v6_ip', '2001:0db8:207a:4a3a:053b:6fab:7df9:1afd'),
))

View File

@@ -106,10 +106,14 @@ class TestVPNService(test_fakes.TestNeutronClientOSCV2):
'Status',
'Description',
'Project',
'Ext v4 IP',
'Ext v6 IP',
)
self.data = _generate_data()
self.ordered_headers = (
'Description',
'Ext v4 IP',
'Ext v6 IP',
'Flavor',
'ID',
'Name',
@@ -121,6 +125,8 @@ class TestVPNService(test_fakes.TestNeutronClientOSCV2):
)
self.ordered_data = (
_vpnservice['description'],
_vpnservice['external_v4_ip'],
_vpnservice['external_v6_ip'],
_vpnservice['flavor_id'],
_vpnservice['id'],
_vpnservice['name'],
@@ -132,6 +138,8 @@ class TestVPNService(test_fakes.TestNeutronClientOSCV2):
)
self.ordered_columns = (
'description',
'external_v4_ip',
'external_v6_ip',
'flavor_id',
'id',
'name',

View File

@@ -0,0 +1,5 @@
---
upgrade:
- |
Python 3.8 support was dropped. The minimum version of Python now supported
is Python 3.9.

View File

@@ -3,4 +3,4 @@
===========================
.. release-notes::
:branch: stable/2023.1
:branch: unmaintained/2023.1

View File

@@ -0,0 +1,6 @@
===========================
2024.1 Series Release Notes
===========================
.. release-notes::
:branch: stable/2024.1

View File

@@ -0,0 +1,6 @@
===========================
2024.2 Series Release Notes
===========================
.. release-notes::
:branch: stable/2024.2

View File

@@ -0,0 +1,6 @@
===========================
2025.1 Series Release Notes
===========================
.. release-notes::
:branch: stable/2025.1

View File

@@ -6,6 +6,9 @@
:maxdepth: 1
unreleased
2025.1
2024.2
2024.1
2023.2
2023.1
zed

View File

@@ -3,4 +3,4 @@ Victoria Series Release Notes
=============================
.. release-notes::
:branch: stable/victoria
:branch: unmaintained/victoria

View File

@@ -3,4 +3,4 @@ Wallaby Series Release Notes
============================
.. release-notes::
:branch: stable/wallaby
:branch: unmaintained/wallaby

View File

@@ -3,4 +3,4 @@ Xena Series Release Notes
=========================
.. release-notes::
:branch: stable/xena
:branch: unmaintained/xena

View File

@@ -3,4 +3,4 @@ Zed Series Release Notes
========================
.. release-notes::
:branch: stable/zed
:branch: unmaintained/zed

View File

@@ -4,7 +4,6 @@
pbr!=2.1.0,>=2.0.0 # Apache-2.0
cliff>=3.4.0 # Apache-2.0
debtcollector>=1.2.0 # Apache-2.0
iso8601>=0.1.11 # MIT
netaddr>=0.7.18 # BSD
openstacksdk>=1.5.0 # Apache-2.0
osc-lib>=1.12.0 # Apache-2.0

View File

@@ -6,7 +6,7 @@ description_file =
author = OpenStack Networking Project
author_email = openstack-discuss@lists.openstack.org
home_page = https://docs.openstack.org/python-neutronclient/latest/
python_requires = >=3.8
python_requires = >=3.9
classifier =
Environment :: OpenStack
Intended Audience :: Developers
@@ -18,8 +18,10 @@ classifier =
Programming Language :: Python :: Implementation :: CPython
Programming Language :: Python :: 3 :: Only
Programming Language :: Python :: 3
Programming Language :: Python :: 3.8
Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10
Programming Language :: Python :: 3.11
Programming Language :: Python :: 3.12
[files]
packages =

View File

@@ -11,5 +11,3 @@ python-subunit>=1.0.0 # Apache-2.0/BSD
requests-mock>=1.2.0 # Apache-2.0
stestr>=2.0.0 # Apache-2.0
testtools>=2.2.0 # MIT
testscenarios>=0.4 # Apache-2.0/BSD
tempest>=17.1.0 # Apache-2.0

View File

@@ -51,7 +51,6 @@ deps =
commands = sphinx-build -W -b html doc/source doc/build/html
[testenv:pdf-docs]
envdir = {toxworkdir}/docs
deps = {[testenv:docs]deps}
allowlist_externals =
make