def __init__(self, *args, **kwargs): super(Manager, self).__init__(*args, **kwargs) # Start the REST web api wsgi = kwargs['wsgi'] self.repo = DataRepo() cntlr_data = {'manager': self, 'repo': self.repo} wsgi.register(web_api.RouteController, cntlr_data) print "hey bro!"
class Manager(app_manager.RyuApp): OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION] _CONTEXTS = {'wsgi': WSGIApplication} _data_paths = {} def __init__(self, *args, **kwargs): super(Manager, self).__init__(*args, **kwargs) # Start the REST web api wsgi = kwargs['wsgi'] self.repo = DataRepo() cntlr_data = {'manager': self, 'repo': self.repo} wsgi.register(web_api.RouteController, cntlr_data) print "hey bro!" @set_ev_cls(ofp_event.EventOFPStateChange, MAIN_DISPATCHER) def new_connection(self, ev): dp = ev.datapath if dp.id not in self._data_paths: self._data_paths[dp.id] = dp self._enable_controller_to_set_flow_table_id(dp) LOG.info('Bridge connection established: |datapath id: %s|' % dp.id) @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER) def handle_packet(self, ev): msg = ev.msg dp = msg.datapath dpid = dp.id dp_info = self._data_paths[dp.id] pkt = packet.Packet(msg.data) if dp_info is None: LOG.error( 'Unexpected packet from an unknown datapath. ' 'Datapath id: %s, Packet: %s' % dpid, pkt) ip = pkt.get_protocol(ipv4.ipv4) if ip is None: LOG.debug('Non layer 3 message received, ignoring. ' 'Packet: %s' % pkt) return if ip.dst in self.repo.get_public_ips(): route = self.repo.get_route(ip.dst) LOG.info('Recieved packet for ip address %s. ' 'Attempting to build the flows' % route['public_ip']) flows.build_all(dp_info, route) else: LOG.info('Unknown ip address %s: blocking temporarily.' % ip.dst) def create_route(self, route): self.repo.set_route(route) for (dp_id, dp) in self._data_paths.iteritems(): flows.build_all(dp, route) @staticmethod def _enable_controller_to_set_flow_table_id(dp): """Sends the command to the bridge to allow the table id to be set for the flow. By default, for OpenFlow v1.0 with Nicira Extensions, the bridges do not allow the table to be set. This flag/feature needs to be turned on explicitly. :param dp: Datapath object of the target bridge """ parser = dp.ofproto_parser msg = parser.NXTFlowModTableId(dp, 1) dp.send_msg(msg)