From 230b2933d82d089775982a1af70d27d95e7d4e25 Mon Sep 17 00:00:00 2001 From: Brad Cowie Date: Thu, 21 Nov 2024 10:49:55 +1300 Subject: [PATCH] Import os-ken 2.11.2 source --- .zuul.yaml | 4 ++ doc/requirements.txt | 2 +- os_ken/app/ofctl/service.py | 5 +- os_ken/controller/controller.py | 3 +- os_ken/controller/ofp_handler.py | 5 +- os_ken/lib/hub.py | 48 +++++++++---------- os_ken/lib/packet/tcp.py | 4 +- os_ken/lib/packet/vrrp.py | 6 +-- os_ken/lib/stplib.py | 2 +- os_ken/lib/stringify.py | 2 +- os_ken/ofproto/ofproto_v1_4.py | 12 ++--- os_ken/ofproto/ofproto_v1_5.py | 12 ++--- os_ken/services/protocols/bgp/api/prefix.py | 4 +- .../services/protocols/bgp/info_base/base.py | 12 ++--- os_ken/services/protocols/bgp/model.py | 6 +-- .../services/protocols/bgp/utils/circlist.py | 30 ++++++------ os_ken/services/protocols/ovsdb/manager.py | 9 ++-- os_ken/tests/integrated/common/docker_base.py | 11 +++-- .../tests/unit/ofproto/test_ofproto_parser.py | 10 ++-- .../unit/ofproto/test_parser_ofpmatch.py | 8 ++-- .../unit/ofproto/test_parser_ofpstats.py | 8 ++-- os_ken/tests/unit/packet/test_bfd.py | 38 +++++++-------- os_ken/tests/unit/packet/test_dhcp.py | 8 ++-- os_ken/tests/unit/packet/test_lldp.py | 8 ++-- os_ken/tests/unit/packet/test_packet.py | 16 +++---- os_ken/tests/unit/packet/test_pbb.py | 4 +- os_ken/topology/switches.py | 4 +- releasenotes/source/2023.1.rst | 2 +- releasenotes/source/2024.2.rst | 6 +++ releasenotes/source/index.rst | 1 + releasenotes/source/zed.rst | 2 +- requirements.txt | 6 +-- setup.cfg | 1 + test-requirements.txt | 8 +--- 34 files changed, 157 insertions(+), 150 deletions(-) create mode 100644 releasenotes/source/2024.2.rst diff --git a/.zuul.yaml b/.zuul.yaml index 136714d..252616f 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -12,3 +12,7 @@ gate: jobs: - neutron-ovs-tempest-dvr + periodic-weekly: + jobs: + - openstack-tox-py311 + - openstack-tox-py312 diff --git a/doc/requirements.txt b/doc/requirements.txt index 60ba470..e85ec58 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -1,4 +1,4 @@ -sphinx>=2.0.0,!=2.1.0 # BSD +sphinx>2.2.0 # BSD openstackdocstheme>=2.2.1 # Apache-2.0 # releasenotes reno>=3.1.0 # Apache-2.0 diff --git a/os_ken/app/ofctl/service.py b/os_ken/app/ofctl/service.py index d472970..c0503dc 100644 --- a/os_ken/app/ofctl/service.py +++ b/os_ken/app/ofctl/service.py @@ -21,8 +21,9 @@ from os_ken.base import app_manager from os_ken.controller import ofp_event -from os_ken.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER,\ - DEAD_DISPATCHER +from os_ken.controller.handler import CONFIG_DISPATCHER +from os_ken.controller.handler import DEAD_DISPATCHER +from os_ken.controller.handler import MAIN_DISPATCHER from os_ken.controller.handler import set_ev_cls from . import event diff --git a/os_ken/controller/controller.py b/os_ken/controller/controller.py index 93db8ad..408cfea 100644 --- a/os_ken/controller/controller.py +++ b/os_ken/controller/controller.py @@ -166,9 +166,8 @@ def stop_client_loop(self, addr): def server_loop(self, ofp_tcp_listen_port, ofp_ssl_listen_port): if CONF.ctl_privkey is not None and CONF.ctl_cert is not None: - p = 'PROTOCOL_TLS' + ssl_args = {'ssl_ctx': ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)} - ssl_args = {'ssl_ctx': ssl.SSLContext(getattr(ssl, p))} # Restrict non-safe versions ssl_args['ssl_ctx'].options |= ssl.OP_NO_SSLv3 | ssl.OP_NO_SSLv2 diff --git a/os_ken/controller/ofp_handler.py b/os_ken/controller/ofp_handler.py index 0a13447..783868c 100644 --- a/os_ken/controller/ofp_handler.py +++ b/os_ken/controller/ofp_handler.py @@ -29,8 +29,9 @@ from os_ken.controller import ofp_event from os_ken.controller.controller import OpenFlowController from os_ken.controller.handler import set_ev_handler -from os_ken.controller.handler import HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER,\ - MAIN_DISPATCHER +from os_ken.controller.handler import CONFIG_DISPATCHER +from os_ken.controller.handler import HANDSHAKE_DISPATCHER +from os_ken.controller.handler import MAIN_DISPATCHER from os_ken.ofproto import ofproto_parser diff --git a/os_ken/lib/hub.py b/os_ken/lib/hub.py index 5c40489..dd49df0 100644 --- a/os_ken/lib/hub.py +++ b/os_ken/lib/hub.py @@ -51,13 +51,6 @@ def patch(thread=True): eventlet.monkey_patch(thread=thread) - if thread: - # Monkey patch the original current_thread to use the up-to-date _active - # global variable. See https://bugs.launchpad.net/bugs/1863021 and - # https://github.com/eventlet/eventlet/issues/592 - import __original_module_threading as orig_threading # noqa - import threading # noqa - orig_threading.current_thread.__globals__['_active'] = threading._active def spawn(*args, **kwargs): raise_error = kwargs.pop('raise_error', False) @@ -137,24 +130,20 @@ def __init__(self, listen_info, handle=None, backlog=None, if ssl_args: ssl_args.setdefault('server_side', True) - if 'ssl_ctx' in ssl_args: - ctx = ssl_args.pop('ssl_ctx') - ctx.load_cert_chain(ssl_args.pop('certfile'), - ssl_args.pop('keyfile')) - if 'cert_reqs' in ssl_args: - ctx.verify_mode = ssl_args.pop('cert_reqs') - if 'ca_certs' in ssl_args: - ctx.load_verify_locations(ssl_args.pop('ca_certs')) - - def wrap_and_handle_ctx(sock, addr): - handle(ctx.wrap_socket(sock, **ssl_args), addr) - - self.handle = wrap_and_handle_ctx - else: - def wrap_and_handle_ssl(sock, addr): - handle(ssl.wrap_socket(sock, **ssl_args), addr) - - self.handle = wrap_and_handle_ssl + if 'ssl_ctx' not in ssl_args: + raise RuntimeError("no SSLContext ssl_ctx in ssl_args") + ctx = ssl_args.pop('ssl_ctx') + ctx.load_cert_chain(ssl_args.pop('certfile'), + ssl_args.pop('keyfile')) + if 'cert_reqs' in ssl_args: + ctx.verify_mode = ssl_args.pop('cert_reqs') + if 'ca_certs' in ssl_args: + ctx.load_verify_locations(ssl_args.pop('ca_certs')) + + def wrap_and_handle_ctx(sock, addr): + handle(ctx.wrap_socket(sock, **ssl_args), addr) + + self.handle = wrap_and_handle_ctx else: self.handle = handle @@ -182,7 +171,14 @@ def connect(self): return None if self.ssl_args: - client = ssl.wrap_socket(client, **self.ssl_args) + ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + ctx.load_cert_chain(self.ssl_args.pop('certfile'), + self.ssl_args.pop('keyfile')) + if 'cert_reqs' in self.ssl_args: + ctx.verify_mode = self.ssl_args.pop('cert_reqs') + if 'ca_certs' in self.ssl_args: + ctx.load_verify_location(self.ssl_args.pop('ca_certs')) + client = ctx.wrap_socket(client, **self.ssl_args) return client diff --git a/os_ken/lib/packet/tcp.py b/os_ken/lib/packet/tcp.py index 4f2da46..672caa4 100644 --- a/os_ken/lib/packet/tcp.py +++ b/os_ken/lib/packet/tcp.py @@ -115,8 +115,8 @@ def get_payload_type(src_port, dst_port): from os_ken.ofproto.ofproto_common import OFP_TCP_PORT, OFP_SSL_PORT_OLD if bgp.TCP_SERVER_PORT in [src_port, dst_port]: return bgp.BGPMessage - elif(src_port in [OFP_TCP_PORT, OFP_SSL_PORT_OLD] or - dst_port in [OFP_TCP_PORT, OFP_SSL_PORT_OLD]): + elif (src_port in [OFP_TCP_PORT, OFP_SSL_PORT_OLD] or + dst_port in [OFP_TCP_PORT, OFP_SSL_PORT_OLD]): return openflow.openflow elif src_port == zebra.ZEBRA_PORT: return zebra._ZebraMessageFromZebra diff --git a/os_ken/lib/packet/vrrp.py b/os_ken/lib/packet/vrrp.py index 7fcb1a6..35d6a99 100644 --- a/os_ken/lib/packet/vrrp.py +++ b/os_ken/lib/packet/vrrp.py @@ -159,7 +159,7 @@ def vrrp_to_version_type(version, type_): def is_ipv6(ip_address): - assert type(ip_address) == str + assert isinstance(ip_address, str) try: addrconv.ipv4.text_to_bin(ip_address) except: @@ -595,11 +595,11 @@ def parser(cls, buf): @staticmethod def serialize_static(vrrp_, prev): if isinstance(prev, ipv4.ipv4): - assert type(vrrp_.ip_addresses[0]) == str + assert isinstance(vrrp_.ip_addresses[0], str) conv = addrconv.ipv4.text_to_bin ip_address_pack_raw = vrrpv3._IPV4_ADDRESS_PACK_STR_RAW elif isinstance(prev, ipv6.ipv6): - assert type(vrrp_.ip_addresses[0]) == str + assert isinstance(vrrp_.ip_addresses[0], str) conv = addrconv.ipv6.text_to_bin ip_address_pack_raw = vrrpv3._IPV6_ADDRESS_PACK_STR_RAW else: diff --git a/os_ken/lib/stplib.py b/os_ken/lib/stplib.py index c791673..337ac83 100644 --- a/os_ken/lib/stplib.py +++ b/os_ken/lib/stplib.py @@ -865,7 +865,7 @@ def _change_status(self, new_state, thread_switch=True): if new_state is not PORT_STATE_DISABLE: self.ofctl.set_port_status(self.ofport, new_state) - if(new_state is PORT_STATE_FORWARD + if (new_state is PORT_STATE_FORWARD or (self.state is PORT_STATE_FORWARD and (new_state is PORT_STATE_DISABLE or new_state is PORT_STATE_BLOCK))): diff --git a/os_ken/lib/stringify.py b/os_ken/lib/stringify.py index fd5a752..bf79c7d 100644 --- a/os_ken/lib/stringify.py +++ b/os_ken/lib/stringify.py @@ -370,7 +370,7 @@ def obj_python_attrs(msg_): # ofp parser implementations. if hasattr(msg_, '_fields'): for k in msg_._fields: - yield(k, getattr(msg_, k)) + yield (k, getattr(msg_, k)) return base = getattr(msg_, '_base_attributes', []) opt = getattr(msg_, '_opt_attributes', []) diff --git a/os_ken/ofproto/ofproto_v1_4.py b/os_ken/ofproto/ofproto_v1_4.py index 2376120..09e3b2a 100644 --- a/os_ken/ofproto/ofproto_v1_4.py +++ b/os_ken/ofproto/ofproto_v1_4.py @@ -160,20 +160,20 @@ # struct ofp_table_mod_prop_eviction OFP_TABLE_MOD_PROP_EVICTION_PACK_STR = '!HHI' OFP_TABLE_MOD_PROP_EVICTION_SIZE = 8 -assert(calcsize(OFP_TABLE_MOD_PROP_EVICTION_PACK_STR) == - OFP_TABLE_MOD_PROP_EVICTION_SIZE) +assert (calcsize(OFP_TABLE_MOD_PROP_EVICTION_PACK_STR) == + OFP_TABLE_MOD_PROP_EVICTION_SIZE) # struct ofp_table_mod_prop_vacancy OFP_TABLE_MOD_PROP_VACANCY_PACK_STR = '!HHBBBx' OFP_TABLE_MOD_PROP_VACANCY_SIZE = 8 -assert(calcsize(OFP_TABLE_MOD_PROP_VACANCY_PACK_STR) == - OFP_TABLE_MOD_PROP_VACANCY_SIZE) +assert (calcsize(OFP_TABLE_MOD_PROP_VACANCY_PACK_STR) == + OFP_TABLE_MOD_PROP_VACANCY_SIZE) # struct ofp_table_mod_prop_experimenter OFP_TABLE_MOD_PROP_EXPERIMENTER_PACK_STR = '!HHII' OFP_TABLE_MOD_PROP_EXPERIMENTER_SIZE = 12 -assert(calcsize(OFP_TABLE_MOD_PROP_EXPERIMENTER_PACK_STR) == - OFP_TABLE_MOD_PROP_EXPERIMENTER_SIZE) +assert (calcsize(OFP_TABLE_MOD_PROP_EXPERIMENTER_PACK_STR) == + OFP_TABLE_MOD_PROP_EXPERIMENTER_SIZE) # struct ofp_table_mod OFP_TABLE_MOD_PACK_STR = '!B3xI' diff --git a/os_ken/ofproto/ofproto_v1_5.py b/os_ken/ofproto/ofproto_v1_5.py index 38f15a4..c5c7ea6 100644 --- a/os_ken/ofproto/ofproto_v1_5.py +++ b/os_ken/ofproto/ofproto_v1_5.py @@ -162,20 +162,20 @@ # struct ofp_table_mod_prop_eviction OFP_TABLE_MOD_PROP_EVICTION_PACK_STR = '!HHI' OFP_TABLE_MOD_PROP_EVICTION_SIZE = 8 -assert(calcsize(OFP_TABLE_MOD_PROP_EVICTION_PACK_STR) == - OFP_TABLE_MOD_PROP_EVICTION_SIZE) +assert (calcsize(OFP_TABLE_MOD_PROP_EVICTION_PACK_STR) == + OFP_TABLE_MOD_PROP_EVICTION_SIZE) # struct ofp_table_mod_prop_vacancy OFP_TABLE_MOD_PROP_VACANCY_PACK_STR = '!HHBBBx' OFP_TABLE_MOD_PROP_VACANCY_SIZE = 8 -assert(calcsize(OFP_TABLE_MOD_PROP_VACANCY_PACK_STR) == - OFP_TABLE_MOD_PROP_VACANCY_SIZE) +assert (calcsize(OFP_TABLE_MOD_PROP_VACANCY_PACK_STR) == + OFP_TABLE_MOD_PROP_VACANCY_SIZE) # struct ofp_table_mod_prop_experimenter OFP_TABLE_MOD_PROP_EXPERIMENTER_PACK_STR = '!HHII' OFP_TABLE_MOD_PROP_EXPERIMENTER_SIZE = 12 -assert(calcsize(OFP_TABLE_MOD_PROP_EXPERIMENTER_PACK_STR) == - OFP_TABLE_MOD_PROP_EXPERIMENTER_SIZE) +assert (calcsize(OFP_TABLE_MOD_PROP_EXPERIMENTER_PACK_STR) == + OFP_TABLE_MOD_PROP_EXPERIMENTER_SIZE) # struct ofp_table_mod OFP_TABLE_MOD_PACK_STR = '!B3xI' diff --git a/os_ken/services/protocols/bgp/api/prefix.py b/os_ken/services/protocols/bgp/api/prefix.py index 0ef837c..3a0807b 100644 --- a/os_ken/services/protocols/bgp/api/prefix.py +++ b/os_ken/services/protocols/bgp/api/prefix.py @@ -368,8 +368,8 @@ def add_evpn_local(route_type, route_dist, next_hop, **kwargs): """Adds EVPN route from VRF identified by *route_dist*. """ - if(route_type in [EVPN_ETH_AUTO_DISCOVERY, EVPN_ETH_SEGMENT] - and kwargs['esi'] == 0): + if (route_type in [EVPN_ETH_AUTO_DISCOVERY, EVPN_ETH_SEGMENT] + and kwargs['esi'] == 0): raise ConfigValueError(conf_name=EVPN_ESI, conf_value=kwargs['esi']) diff --git a/os_ken/services/protocols/bgp/info_base/base.py b/os_ken/services/protocols/bgp/info_base/base.py index d31bb6c..7acd37f 100644 --- a/os_ken/services/protocols/bgp/info_base/base.py +++ b/os_ken/services/protocols/bgp/info_base/base.py @@ -428,7 +428,7 @@ def remove_old_paths_from_source(self, source): Returns *True* if any of the known paths were found to be old and removed/deleted. """ - assert(source and hasattr(source, 'version_num')) + assert (source and hasattr(source, 'version_num')) removed_paths = [] # Iterate over the paths in reverse order as we want to delete paths # whose source is this peer. @@ -438,7 +438,7 @@ def remove_old_paths_from_source(self, source): if (path.source == source and path.source_version_num < source_ver_num): # If this peer is source of any paths, remove those path. - del(self._known_path_list[path_idx]) + del self._known_path_list[path_idx] removed_paths.append(path) return removed_paths @@ -485,7 +485,7 @@ def _process_paths(self): # If we do not have any old but one new path # it becomes best path. self._known_path_list.append(self._new_path_list[0]) - del(self._new_path_list[0]) + del self._new_path_list[0] return self._known_path_list[0], BPR_ONLY_PATH # If we have a new version of old/known path we use it and delete old @@ -496,7 +496,7 @@ def _process_paths(self): self._known_path_list.extend(self._new_path_list) # Clear new paths as we copied them. - del(self._new_path_list[:]) + del self._new_path_list[:] # If we do not have any paths to this destination, then we do not have # new best path. @@ -528,7 +528,7 @@ def _remove_withdrawals(self): if not self._known_path_list: LOG.debug('Found %s withdrawals for path(s) that did not get' ' installed.', len(self._withdraw_list)) - del(self._withdraw_list[:]) + del self._withdraw_list[:] return # If we have some known paths and some withdrawals, we find matches and @@ -1193,7 +1193,7 @@ class AttributeMap(object): def __init__(self, filters, attr_type, attr_value): - assert all(isinstance(f, Filter) for f in filters),\ + assert all(isinstance(f, Filter) for f in filters), \ 'all the items in filters must be an instance of Filter sub-class' self.filters = filters self.attr_type = attr_type diff --git a/os_ken/services/protocols/bgp/model.py b/os_ken/services/protocols/bgp/model.py index 2c89c66..ef121bf 100644 --- a/os_ken/services/protocols/bgp/model.py +++ b/os_ken/services/protocols/bgp/model.py @@ -51,7 +51,7 @@ class OutgoingRoute(object): 'next_sink_out_route', 'prev_sink_out_route') def __init__(self, path, for_route_refresh=False): - assert(path) + assert path self.sink = None @@ -145,7 +145,7 @@ class SentRoute(object): """ def __init__(self, path, peer, filtered=None, timestamp=None): - assert(path and hasattr(peer, 'version_num')) + assert (path and hasattr(peer, 'version_num')) self.path = path @@ -175,7 +175,7 @@ class ReceivedRoute(object): """ def __init__(self, path, peer, filtered=None, timestamp=None): - assert(path and hasattr(peer, 'version_num')) + assert (path and hasattr(peer, 'version_num')) self.path = path diff --git a/os_ken/services/protocols/bgp/utils/circlist.py b/os_ken/services/protocols/bgp/utils/circlist.py index 5d19c1e..0b1d00b 100644 --- a/os_ken/services/protocols/bgp/utils/circlist.py +++ b/os_ken/services/protocols/bgp/utils/circlist.py @@ -66,24 +66,24 @@ def __init__(self, list_type): self.list_type.node_init(self.head) def __getattr__(self, name): - if(name == self.list_type.next_name): + if name == self.list_type.next_name: return self._next_slot_ - if(name == self.list_type.prev_name): + if name == self.list_type.prev_name: return self._prev_slot_ raise AttributeError(name) def __setattr__(self, name, value): - if(name in CircularListType.List.__slots__): + if name in CircularListType.List.__slots__: object.__setattr__(self, name, value) return - if(name == self.list_type.next_name): + if name == self.list_type.next_name: self._next_slot_ = value return - if(name == self.list_type.prev_name): + if name == self.list_type.prev_name: self._prev_slot_ = value return @@ -124,7 +124,7 @@ def remove(self, node): def pop_first(self): """Remove the first item in the list and return it.""" node = self.list_type.node_next(self.head) - if(node is self.head): + if node is self.head: return None self.remove(node) @@ -141,7 +141,7 @@ def generator(self): # current node safely. node = self.list_type.node_next(self.head) next = self.list_type.node_next(node) - while(node is not self.head): + while node is not self.head: yield node node = next @@ -176,7 +176,7 @@ def __call__(self): return self.create() def node_init(self, node): - assert(not self.node_is_on_list(node)) + assert (not self.node_is_on_list(node)) # Set the node to point to itself as the previous and next # entries. @@ -219,7 +219,7 @@ def node_is_on_list(self, node): """ next = self.node_next(node) if next == node or next is None: - assert(self.node_prev(node) is next) + assert (self.node_prev(node) is next) return False return True @@ -227,11 +227,11 @@ def node_is_on_list(self, node): def node_insert_after(self, node, new_node): """Insert the new node after node.""" - assert(not self.node_is_on_list(new_node)) - assert(node is not new_node) + assert (not self.node_is_on_list(new_node)) + assert (node is not new_node) next = self.node_next(node) - assert(next is not None) + assert (next is not None) self.node_set_next(node, new_node) self.node_set_prev(new_node, node) @@ -241,11 +241,11 @@ def node_insert_after(self, node, new_node): def node_insert_before(self, node, new_node): """Insert the new node before node.""" - assert(not self.node_is_on_list(new_node)) - assert(node is not new_node) + assert (not self.node_is_on_list(new_node)) + assert (node is not new_node) prev = self.node_prev(node) - assert(prev is not None) + assert (prev is not None) self.node_set_prev(node, new_node) self.node_set_next(new_node, node) diff --git a/os_ken/services/protocols/ovsdb/manager.py b/os_ken/services/protocols/ovsdb/manager.py index 8aa5a9b..e8bf4fe 100644 --- a/os_ken/services/protocols/ovsdb/manager.py +++ b/os_ken/services/protocols/ovsdb/manager.py @@ -173,13 +173,14 @@ def start(self): cert = self.CONF.ovsdb.mngr_cert or self.CONF.ctl_cert if key is not None and cert is not None: - ssl_kwargs = dict(keyfile=key, certfile=cert, server_side=True) + ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) + ctx.load_cert_chain(cert, key) if self.CONF.ca_certs is not None: - ssl_kwargs['cert_reqs'] = ssl.CERT_REQUIRED - ssl_kwargs['ca_certs'] = self.CONF.ca_certs + ctx.verify_mode = ssl.CERT_REQUIRED + ctx.load_verify_locations(self.CONF.ca_certs) - server = ssl.wrap_socket(server, **ssl_kwargs) + server = ctx.wrap_socket(server, server_side=True) self._server = server diff --git a/os_ken/tests/integrated/common/docker_base.py b/os_ken/tests/integrated/common/docker_base.py index 0e06e5b..3b8eafb 100644 --- a/os_ken/tests/integrated/common/docker_base.py +++ b/os_ken/tests/integrated/common/docker_base.py @@ -155,9 +155,14 @@ def exist(self, name): return name in self.get_images() def build(self, tagname, dockerfile_dir): - self.cmd.sudo( - "docker build -t {0} {1}".format(tagname, dockerfile_dir), - try_times=3) + try: + self.cmd.sudo( + 'docker build -t {0} {1}'.format(tagname, dockerfile_dir)) + except CommandError: + self.cmd.sudo('docker builder prune -f') + self.cmd.sudo( + 'docker build -t {0} {1}'.format(tagname, dockerfile_dir), + try_times=2) def remove(self, tagname, check_exist=False): if check_exist and not self.exist(tagname): diff --git a/os_ken/tests/unit/ofproto/test_ofproto_parser.py b/os_ken/tests/unit/ofproto/test_ofproto_parser.py index 13e5013..a3ab8e8 100644 --- a/os_ken/tests/unit/ofproto/test_ofproto_parser.py +++ b/os_ken/tests/unit/ofproto/test_ofproto_parser.py @@ -79,11 +79,11 @@ def testFeaturesReply(self): self.bufFeaturesReply) LOG.debug(msg) - self.assertTrue(isinstance(msg, ofproto_v1_0_parser.OFPSwitchFeatures)) + self.assertIsInstance(msg, ofproto_v1_0_parser.OFPSwitchFeatures) LOG.debug(msg.ports[65534]) - self.assertTrue(isinstance(msg.ports[1], ofproto_v1_0_parser.OFPPhyPort)) - self.assertTrue(isinstance(msg.ports[2], ofproto_v1_0_parser.OFPPhyPort)) - self.assertTrue(isinstance(msg.ports[65534], ofproto_v1_0_parser.OFPPhyPort)) + self.assertIsInstance(msg.ports[1], ofproto_v1_0_parser.OFPPhyPort) + self.assertIsInstance(msg.ports[2], ofproto_v1_0_parser.OFPPhyPort) + self.assertIsInstance(msg.ports[65534], ofproto_v1_0_parser.OFPPhyPort) def testPacketIn(self): (version, @@ -98,7 +98,7 @@ def testPacketIn(self): xid, self.bufPacketIn) LOG.debug(msg) - self.assertTrue(isinstance(msg, ofproto_v1_0_parser.OFPPacketIn)) + self.assertIsInstance(msg, ofproto_v1_0_parser.OFPPacketIn) def test_check_msg_len(self): (version, diff --git a/os_ken/tests/unit/ofproto/test_parser_ofpmatch.py b/os_ken/tests/unit/ofproto/test_parser_ofpmatch.py index 76ada41..ee6eb6a 100644 --- a/os_ken/tests/unit/ofproto/test_parser_ofpmatch.py +++ b/os_ken/tests/unit/ofproto/test_parser_ofpmatch.py @@ -259,13 +259,13 @@ def _test(self, name, ofpp, d, domask): match.serialize(b, 0) match2 = match.parser(bytes(b), 0) for k, v in d.items(): - self.assertTrue(k in match) - self.assertTrue(k in match2) + self.assertIn(k, match) + self.assertIn(k, match2) self.assertEqual(match[k], v) self.assertEqual(match2[k], v) for k, v in match.iteritems(): - self.assertTrue(k in d) + self.assertIn(k, d) self.assertEqual(d[k], v) for k, v in match2.iteritems(): - self.assertTrue(k in d) + self.assertIn(k, d) self.assertEqual(d[k], v) diff --git a/os_ken/tests/unit/ofproto/test_parser_ofpstats.py b/os_ken/tests/unit/ofproto/test_parser_ofpstats.py index 581f07f..952a419 100644 --- a/os_ken/tests/unit/ofproto/test_parser_ofpstats.py +++ b/os_ken/tests/unit/ofproto/test_parser_ofpstats.py @@ -176,13 +176,13 @@ def _test(self, name, ofpp, d): stats.serialize(b, 0) stats2 = stats.parser(bytes(b), 0) for k, v in d.items(): - self.assertTrue(k in stats) - self.assertTrue(k in stats2) + self.assertIn(k, stats) + self.assertIn(k, stats2) self.assertEqual(stats[k], v) self.assertEqual(stats2[k], v) for k, v in stats.iteritems(): - self.assertTrue(k in d) + self.assertIn(k, d) self.assertEqual(d[k], v) for k, v in stats2.iteritems(): - self.assertTrue(k in d) + self.assertIn(k, d) self.assertEqual(d[k], v) diff --git a/os_ken/tests/unit/packet/test_bfd.py b/os_ken/tests/unit/packet/test_bfd.py index 2ee7b35..adf7de7 100644 --- a/os_ken/tests/unit/packet/test_bfd.py +++ b/os_ken/tests/unit/packet/test_bfd.py @@ -94,23 +94,23 @@ def test_parse(self): pkt = packet.Packet(buf) i = iter(pkt) - self.assertEqual(type(next(i)), ethernet.ethernet) - self.assertEqual(type(next(i)), ipv4.ipv4) - self.assertEqual(type(next(i)), udp.udp) - self.assertEqual(type(bfd.bfd.parser(next(i))[0]), bfd.bfd) + self.assertIsInstance(next(i), ethernet.ethernet) + self.assertIsInstance(next(i), ipv4.ipv4) + self.assertIsInstance(next(i), udp.udp) + self.assertIsInstance(bfd.bfd.parser(next(i))[0], bfd.bfd) def test_parse_with_auth_simple(self): buf = self.data_auth_simple pkt = packet.Packet(buf) i = iter(pkt) - self.assertEqual(type(next(i)), ethernet.ethernet) - self.assertEqual(type(next(i)), ipv4.ipv4) - self.assertEqual(type(next(i)), udp.udp) + self.assertIsInstance(next(i), ethernet.ethernet) + self.assertIsInstance(next(i), ipv4.ipv4) + self.assertIsInstance(next(i), udp.udp) bfd_obj = bfd.bfd.parser(next(i))[0] - self.assertEqual(type(bfd_obj), bfd.bfd) - self.assertEqual(type(bfd_obj.auth_cls), bfd.SimplePassword) + self.assertIsInstance(bfd_obj, bfd.bfd) + self.assertIsInstance(bfd_obj.auth_cls, bfd.SimplePassword) self.assertTrue(bfd_obj.authenticate(self.auth_keys)) def test_parse_with_auth_md5(self): @@ -118,13 +118,13 @@ def test_parse_with_auth_md5(self): pkt = packet.Packet(buf) i = iter(pkt) - self.assertEqual(type(next(i)), ethernet.ethernet) - self.assertEqual(type(next(i)), ipv4.ipv4) - self.assertEqual(type(next(i)), udp.udp) + self.assertIsInstance(next(i), ethernet.ethernet) + self.assertIsInstance(next(i), ipv4.ipv4) + self.assertIsInstance(next(i), udp.udp) bfd_obj = bfd.bfd.parser(next(i))[0] - self.assertEqual(type(bfd_obj), bfd.bfd) - self.assertEqual(type(bfd_obj.auth_cls), bfd.KeyedMD5) + self.assertIsInstance(bfd_obj, bfd.bfd) + self.assertIsInstance(bfd_obj.auth_cls, bfd.KeyedMD5) self.assertTrue(bfd_obj.authenticate(self.auth_keys)) def test_parse_with_auth_sha1(self): @@ -132,13 +132,13 @@ def test_parse_with_auth_sha1(self): pkt = packet.Packet(buf) i = iter(pkt) - self.assertEqual(type(next(i)), ethernet.ethernet) - self.assertEqual(type(next(i)), ipv4.ipv4) - self.assertEqual(type(next(i)), udp.udp) + self.assertIsInstance(next(i), ethernet.ethernet) + self.assertIsInstance(next(i), ipv4.ipv4) + self.assertIsInstance(next(i), udp.udp) bfd_obj = bfd.bfd.parser(next(i))[0] - self.assertEqual(type(bfd_obj), bfd.bfd) - self.assertEqual(type(bfd_obj.auth_cls), bfd.KeyedSHA1) + self.assertIsInstance(bfd_obj, bfd.bfd) + self.assertIsInstance(bfd_obj.auth_cls, bfd.KeyedSHA1) self.assertTrue(bfd_obj.authenticate(self.auth_keys)) def test_serialize(self): diff --git a/os_ken/tests/unit/packet/test_dhcp.py b/os_ken/tests/unit/packet/test_dhcp.py index b0e519f..9bcb652 100644 --- a/os_ken/tests/unit/packet/test_dhcp.py +++ b/os_ken/tests/unit/packet/test_dhcp.py @@ -130,11 +130,11 @@ def test_parser_corrupted(self): corrupt_buf = self.buf[:-4] pkt, _, rest = dhcp.dhcp.parser(corrupt_buf) - self.assertTrue(isinstance(pkt, dhcp.dhcp)) - self.assertTrue(isinstance(pkt.options, dhcp.options)) + self.assertIsInstance(pkt, dhcp.dhcp) + self.assertIsInstance(pkt.options, dhcp.options) for opt in pkt.options.option_list[:-1]: - self.assertTrue(isinstance(opt, dhcp.option)) - self.assertTrue(isinstance(pkt.options.option_list[-1], bytes)) + self.assertIsInstance(opt, dhcp.option) + self.assertIsInstance(pkt.options.option_list[-1], bytes) buf = pkt.serialize() self.assertEqual(str(buf), str(corrupt_buf)) diff --git a/os_ken/tests/unit/packet/test_lldp.py b/os_ken/tests/unit/packet/test_lldp.py index 68c8cde..f761b1c 100644 --- a/os_ken/tests/unit/packet/test_lldp.py +++ b/os_ken/tests/unit/packet/test_lldp.py @@ -70,8 +70,8 @@ def test_parse(self): pkt = packet.Packet(buf) i = iter(pkt) - self.assertEqual(type(next(i)), ethernet.ethernet) - self.assertEqual(type(next(i)), lldp.lldp) + self.assertIsInstance(next(i), ethernet.ethernet) + self.assertIsInstance(next(i), lldp.lldp) def test_tlv(self): tlv = lldp.ChassisID(subtype=lldp.ChassisID.SUB_MAC_ADDRESS, @@ -246,9 +246,9 @@ def test_parse(self): pkt = packet.Packet(buf) i = iter(pkt) - self.assertEqual(type(next(i)), ethernet.ethernet) + self.assertIsInstance(next(i), ethernet.ethernet) lldp_pkt = next(i) - self.assertEqual(type(lldp_pkt), lldp.lldp) + self.assertIsInstance(lldp_pkt, lldp.lldp) tlvs = lldp_pkt.tlvs diff --git a/os_ken/tests/unit/packet/test_packet.py b/os_ken/tests/unit/packet/test_packet.py index 86988cd..19bb788 100644 --- a/os_ken/tests/unit/packet/test_packet.py +++ b/os_ken/tests/unit/packet/test_packet.py @@ -368,7 +368,7 @@ def test_ipv4_udp(self): self.assertEqual(packet_utils.checksum(t), 0) # payload - self.assertTrue('payload' in protocols) + self.assertIn('payload', protocols) self.assertEqual(self.payload, protocols['payload']) # to string @@ -518,7 +518,7 @@ def test_ipv4_tcp(self): self.assertEqual(packet_utils.checksum(t), 0) # payload - self.assertTrue('payload' in protocols) + self.assertIn('payload', protocols) self.assertEqual(self.payload, protocols['payload']) # to string @@ -939,7 +939,7 @@ def test_ipv6_udp(self): self.assertEqual(packet_utils.checksum(t), 0x62) # payload - self.assertTrue('payload' in protocols) + self.assertIn('payload', protocols) self.assertEqual(self.payload, protocols['payload']) # to string @@ -1071,7 +1071,7 @@ def test_ipv6_tcp(self): self.assertEqual(packet_utils.checksum(t), 0x62) # payload - self.assertTrue('payload' in protocols) + self.assertIn('payload', protocols) self.assertEqual(self.payload, protocols['payload']) # to string @@ -1544,7 +1544,7 @@ def test_div_api(self): i = ipv4.ipv4() u = udp.udp(self.src_port, self.dst_port) pkt = e / i / u - self.assertTrue(isinstance(pkt, packet.Packet)) - self.assertTrue(isinstance(pkt.protocols[0], ethernet.ethernet)) - self.assertTrue(isinstance(pkt.protocols[1], ipv4.ipv4)) - self.assertTrue(isinstance(pkt.protocols[2], udp.udp)) + self.assertIsInstance(pkt, packet.Packet) + self.assertIsInstance(pkt.protocols[0], ethernet.ethernet) + self.assertIsInstance(pkt.protocols[1], ipv4.ipv4) + self.assertIsInstance(pkt.protocols[2], udp.udp) diff --git a/os_ken/tests/unit/packet/test_pbb.py b/os_ken/tests/unit/packet/test_pbb.py index 890a8b4..48ac6bd 100644 --- a/os_ken/tests/unit/packet/test_pbb.py +++ b/os_ken/tests/unit/packet/test_pbb.py @@ -133,13 +133,13 @@ def test_build_itag(self): e = p.get_protocols(ethernet.ethernet) self.assertTrue(e) - self.assertTrue(isinstance(e, list)) + self.assertIsInstance(e, list) self.assertEqual(e[0].ethertype, ether.ETH_TYPE_8021AD) self.assertEqual(e[1].ethertype, ether.ETH_TYPE_8021AD) sv = p.get_protocols(vlan.svlan) self.assertTrue(sv) - self.assertTrue(isinstance(sv, list)) + self.assertIsInstance(sv, list) self.assertEqual(sv[0].ethertype, ether.ETH_TYPE_8021Q) self.assertEqual(sv[1].ethertype, ether.ETH_TYPE_8021Q) diff --git a/os_ken/topology/switches.py b/os_ken/topology/switches.py index 25ff6e2..0431c8f 100644 --- a/os_ken/topology/switches.py +++ b/os_ken/topology/switches.py @@ -465,10 +465,10 @@ def lldp_parse(data): pkt = packet.Packet(data) i = iter(pkt) eth_pkt = next(i) - assert type(eth_pkt) == ethernet.ethernet + assert isinstance(eth_pkt, ethernet.ethernet) lldp_pkt = next(i) - if type(lldp_pkt) != lldp.lldp: + if not isinstance(lldp_pkt, lldp.lldp): raise LLDPPacket.LLDPUnknownFormat() tlv_chassis_id = lldp_pkt.tlvs[0] diff --git a/releasenotes/source/2023.1.rst b/releasenotes/source/2023.1.rst index d123847..2c9a36f 100644 --- a/releasenotes/source/2023.1.rst +++ b/releasenotes/source/2023.1.rst @@ -3,4 +3,4 @@ =========================== .. release-notes:: - :branch: stable/2023.1 + :branch: unmaintained/2023.1 diff --git a/releasenotes/source/2024.2.rst b/releasenotes/source/2024.2.rst new file mode 100644 index 0000000..aaebcbc --- /dev/null +++ b/releasenotes/source/2024.2.rst @@ -0,0 +1,6 @@ +=========================== +2024.2 Series Release Notes +=========================== + +.. release-notes:: + :branch: stable/2024.2 diff --git a/releasenotes/source/index.rst b/releasenotes/source/index.rst index 78fdb97..655a80a 100644 --- a/releasenotes/source/index.rst +++ b/releasenotes/source/index.rst @@ -6,6 +6,7 @@ :maxdepth: 1 unreleased + 2024.2 2024.1 2023.2 2023.1 diff --git a/releasenotes/source/zed.rst b/releasenotes/source/zed.rst index 9608c05..6cc2b15 100644 --- a/releasenotes/source/zed.rst +++ b/releasenotes/source/zed.rst @@ -3,4 +3,4 @@ Zed Series Release Notes ======================== .. release-notes:: - :branch: stable/zed + :branch: unmaintained/zed diff --git a/requirements.txt b/requirements.txt index ccaa2e4..6e15ad8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,12 +2,8 @@ # date but we do not test them so no guarantee of having them all correct. If # you find any incorrect lower bounds, let us know or propose a fix. -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. - pbr>=2.0.0 # Apache-2.0 -eventlet>=0.26.1 # MIT +eventlet>=0.27.0 # MIT msgpack>=1.0.0 # RPC library, BGP speaker(net_cntl) ncclient>=0.6.13 # Apache-2.0 netaddr>=0.7.18 # BSD diff --git a/setup.cfg b/setup.cfg index 35bab6f..1d6e0db 100644 --- a/setup.cfg +++ b/setup.cfg @@ -18,6 +18,7 @@ classifier = Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 + Programming Language :: Python :: 3.11 [files] packages = diff --git a/test-requirements.txt b/test-requirements.txt index f895bac..089cb54 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,10 +1,6 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. +hacking>=6.1.0,<6.2.0 # Apache-2.0 -hacking>=3.2.0,<3.3.0 # Apache-2.0 - -coverage>=4.0,!=4.4 # Apache-2.0 +coverage>=4.4.1 # Apache-2.0 python-subunit>=1.0.0 # Apache-2.0/BSD oslotest>=3.2.0 # Apache-2.0 stestr>=1.0.0 # Apache-2.0