Source code for sts.util.socket_mux.pox_monkeypatcher

# Copyright 2011-2013 Colin Scott
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


from server_socket_multiplexer import ServerMultiplexedSelect,ServerMockSocket
import select
import socket

# Note: Make sure that this module is loaded after all other modules except
# of_01; the OpenFlow listen socket needs to be mocked.

[docs]def launch(): # Server side: # - Instantiate ServerMultipexedSelect (this will create a true # socket for the pinger) # - override select.select with ServerMultiplexedSelect # - override socket.socket # - takes two params: protocol, socket type # - if not SOCK_STREAM type, return a normal socket # - we don't know bind address until bind() is called # - after bind(), create true socket, create SocketDemultiplexer # All subsequent sockets will be instantiated through accept() mux_select = ServerMultiplexedSelect() # Monkey patch select.select select._old_select = select.select select.select = mux_select.select # Monkey patch socket.socket socket._old_socket = socket.socket def socket_patch(protocol, sock_type): if sock_type == socket.SOCK_STREAM: return ServerMockSocket(protocol, sock_type, set_true_listen_socket=mux_select.set_true_listen_socket) else: socket._old_socket(protocol, sock_type) socket.socket = socket_patch # TODO(cs): will mux_select be GC'ed?