calling base class method fetches no results
david jhon
djhon9813 at gmail.com
Sat May 9 08:08:05 EDT 2015
I am really sorry for any inconvenience caused, I was trying to fix this
bug from last 2 days so I had to post it here. It now has been resolved.
Thanks a lot for your time. I'll be careful again. Have a great weekend!
On Sat, May 9, 2015 at 4:36 PM, Dave Angel <davea at davea.name> wrote:
> On 05/09/2015 03:59 AM, david jhon wrote:
>
>> Hi, I am sorry for sending in five attachments, I cloned the code from
>> here
>> <https://bitbucket.org/msharif/hedera/src>: Let me explain it here:
>>
>>
> Please don't top-post. Your earlier problem description, which I could
> make no sense of, is now located after your later "clarification".
>
> Thanks for eliminating the attachments. Many cannot see them. And for
> extracting only part of the code into the message. It's still too much for
> me, but others may manage it okay. To me, it seems likely that most of
> that code will not have any part in the problem you're describing. And in
> some places you have code that's missing its context.
>
> Now, eliminate the pieces of code that are irrelevant to your question,
> and state the problem in terms that make sense. Somebody is instantiating
> an object. Exactly which class is being used for that? Somebody else is
> calling a particular method (be specific, rather than just saying "some
> method"), and it's giving the wrong results. And apparently, those wrong
> results depend on which source file something happens in.
>
>
>
> Routing Base class defined in DCRouting.py:
>>
>> import logging
>> from copy import copy
>>
>> class Routing(object):
>> '''Base class for data center network routing.
>>
>> Routing engines must implement the get_route() method.
>> '''
>>
>> def __init__(self, topo):
>> '''Create Routing object.
>>
>> @param topo Topo object from Net parent
>> '''
>> self.topo = topo
>>
>> def get_route(self, src, dst, hash_):
>> '''Return flow path.
>>
>> @param src source host
>> @param dst destination host
>> @param hash_ hash value
>>
>> @return flow_path list of DPIDs to traverse (including hosts)
>> '''
>> raise NotImplementedError
>>
>> def routes(self, src, dst):
>> ''' Return list of paths
>>
>> Only works for Fat-Tree topology
>>
>> @ param src source host
>> @ param dst destination host
>>
>> @ return list of DPIDs (including inputs)
>> '''
>>
>> complete_paths = [] # List of complete dpid routes
>>
>> src_paths = { src : [[src]] }
>> dst_paths = { dst : [[dst]] }
>>
>> dst_layer = self.topo.layer(dst)
>> src_layer = self.topo.layer(src)
>>
>> lower_layer = src_layer
>> if dst_layer > src_layer:
>> lower_layer = dst_layer
>>
>>
>> for front_layer in range(lower_layer-1, -1, -1):
>> if src_layer > front_layer:
>> # expand src frontier
>> new_src_paths = {}
>> for node in sorted(src_paths):
>> path_list = src_paths[node]
>> for path in path_list:
>> last_node = path[-1]
>> for frontier_node in
>> self.topo.upper_nodes(last_node):
>> new_src_paths[frontier_node] = [path +
>> [frontier_node]]
>>
>> if frontier_node in dst_paths:
>> dst_path_list = dst_paths[frontier_node]
>> for dst_path in dst_path_list:
>> dst_path_copy = copy ( dst_path )
>> dst_path_copy.reverse()
>> complete_paths.append( path +
>> dst_path_copy)
>> src_paths = new_src_paths
>>
>> if dst_layer > front_layer:
>> # expand dst frontier
>> new_dst_paths = {}
>> for node in sorted(dst_paths):
>> path_list = dst_paths[node]
>> for path in path_list:
>> last_node = path[-1]
>> for frontier_node in
>> self.topo.upper_nodes(last_node):
>> new_dst_paths[frontier_node] = [ path +
>> [frontier_node]]
>>
>> if frontier_node in src_paths:
>> src_path_list = src_paths[frontier_node]
>> dst_path_copy = copy( path )
>> dst_path_copy.reverse()
>> for src_path in src_path_list:
>> complete_paths.append( src_path +
>> dst_path_copy)
>>
>> dst_paths = new_dst_paths
>>
>> if complete_paths:
>> return complete_paths
>> class HashedRouting(Routing):
>> ''' Hashed routing '''
>>
>> def __init__(self, topo):
>> self.topo = topo
>>
>> def get_route(self, src, dst, hash_):
>> ''' Return flow path. '''
>>
>> if src == dst:
>> return [src]
>>
>> paths = self.routes(src,dst)
>> if paths:
>> #print 'hash_:', hash_
>> choice = hash_ % len(paths)
>> #print 'choice:', choice
>> path = sorted(paths)[choice]
>> #print 'path:', path
>> return path
>>
>> ============>
>> Instantiated in util.py:
>>
>> from DCTopo import FatTreeTopo
>> from mininet.util import makeNumeric
>> from DCRouting import HashedRouting, Routing
>>
>> TOPOS = {'ft': FatTreeTopo}
>> ROUTING = {'ECMP' : HashedRouting}
>>
>>
>> def buildTopo(topo):
>> topo_name, topo_param = topo.split( ',' )
>> return TOPOS[topo_name](makeNumeric(topo_param))
>>
>>
>> def getRouting(routing, topo):
>> return ROUTING[routing](topo)
>>
>
> A comment on that last line that says it instantiates the child class
> would have been very helpful.
>
> But even though I can now search for calls to that function, I still
> cannot make sense out of that context, either.
>
>
>
>> ============================> utilized in HController. py:
>> A Piece of code which works with self.r.routes() method:
>> Following list of methods are defined in HController.py
>>
>> def _ecmp_hash(self, packet):
>> ''' Return an ECMP-style 5-tuple hash for TCP/IP packets,
>> otherwise
>> 0.
>> RFC2992 '''
>> hash_input = [0] * 5
>> if isinstance(packet.next, ipv4):
>> ip = packet.next
>> hash_input[0] = ip.srcip.toUnsigned()
>> hash_input[1] = ip.dstip.toUnsigned()
>> hash_input[2] = ip.protocol
>> if isinstance(ip.next, tcp) or isinstance(ip.next, udp):
>> l4 = ip.next
>> hash_input[3] = l4.srcport
>> hash_input[4] = l4.dstport
>> return crc32(pack('LLHHH', *hash_input))
>> return 0
>>
>> def _install_reactive_path(self, event, out_dpid, final_out_port,
>> packet):
>> ''' Install entries on route between two switches. '''
>> in_name = self.t.node_gen(dpid = event.dpid).name_str()
>> out_name = self.t.node_gen(dpid = out_dpid).name_str()
>> hash_ = self._ecmp_hash(packet)
>> paths = self.r.routes(src_name, dst_name)
>> if paths == None:
>> print "PATH is None :("
>> return
>> route = self.r.get_route(in_name, out_name, hash_)
>> print "Route:",route
>> print '-'*80
>> if route == None:
>> print None, "route between", in_name, "and", out_name
>> return
>>
>> match = of.ofp_match.from_packet(packet)
>>
>> for i, node in enumerate(route):
>> node_dpid = self.t.node_gen(name = node).dpid
>> if i < len(route) - 1:
>> next_node = route[i + 1]
>> out_port, next_in_port = self.t.port(node, next_node)
>> else:
>> out_port = final_out_port
>> self.switches[node_dpid].install(out_port, match,
>> idle_timeout
>> = 10)
>>
>> if isinstance(packet.next, of.ipv4) and
>> isinstance(packet.next.next, of.tcp):
>> self.matchDict[(packet.next.srcip, packet.next.dstip,
>> packet.next.next.srcport, packet.next.next.dstport)] = (route, match)
>>
>> def _handle_PacketIn(self, event):
>> if not self.all_switches_up:
>> #log.info("Saw PacketIn before all switches were up -
>> ignoring." )
>> return
>>
>> packet = event.parsed
>> dpid = event.dpid
>> in_port = event.port
>>
>> # Learn MAC address of the sender on every packet-in.
>> self.macTable[packet.src] = (dpid, in_port)
>> sw_name = self.t.node_gen(dpid = dpid).name_str()
>> #print "Sw:", sw_name, packet.src, packet.dst,"port", in_port,
>> packet.dst.isMulticast(),"macTable", packet.dst in self.macTable
>> #print '-'*80
>>
>> # Insert flow, deliver packet directly to destination.
>>
>> if packet.dst in self.macTable:
>> out_dpid, out_port = self.macTable[packet.dst]
>> self._install_reactive_path(event, out_dpid, out_port,
>> packet)
>>
>> self.switches[out_dpid].send_packet_data(out_port,
>> event.data)
>>
>> else:
>> self._flood(event)
>>
>> ===================> code snippet which returns 'None' number of paths.
>> def _GlobalFirstFit(self,flow):
>> '''do the Hedera global first fit here'''
>> src_name = self.t.node_gen(dpid = flow['src']).name_str()
>> dst_name = self.t.node_gen(dpid = flow['dst']).name_str()
>> print 'Global Fisrt Fit for the elephant flow from
>> ',src_name,'to',
>> dst_name
>> paths = self.r.routes(src_name,dst_name)
>> print 'all routes found for the big flow:\n',paths
>> GFF_route = None
>> if paths == None:
>> return
>> else:
>> for path in paths:
>> fitCheck = True
>>
>> for i in range(1,len(path)):
>> fitCheck = False
>> if self.bwReservation.has_key(path[i-1]) and
>> self.bwReservation[path[i-1]].has_key(path[i]):
>> if
>> self.bwReservation[path[i-1]][path[i]]['reserveDemand'] + flow['demand'] >
>> 1 :
>> break
>> else:
>>
>> #self.bwReservation[path[i-1]][path[i]]['reserveDemand'] += flow['demand']
>> fitCheck = True
>> else:
>> self.bwReservation[path[i-1]]={}
>>
>> self.bwReservation[path[i-1]][path[i]]={'reserveDemand':0}
>> fitCheck = True
>> if fitCheck == True:
>> for i in range(1,len(path)):
>>
>> self.bwReservation[path[i-1]][path[i]]['reserveDemand']
>> += flow['demand']
>> GFF_route = path
>> print "GFF route found:", path
>> break
>> if GFF_route != None:
>> """install new GFF_path between source and destintaion"""
>> self. _install_GFF_path(GFF_route,flow['match'])
>>
>> def launch(topo = None, routing = None, bw = None ):
>> #print topo
>> if not topo:
>> raise Exception ("Please specify the topology")
>> else:
>> t = buildTopo(topo)
>>
>> r = getRouting(routing, t)
>> if bw == None:
>> bw = 10.0 #Mb/s
>> bw = float(bw/1000) #Gb/s
>> else:
>> bw = float(bw)/1000
>> core.registerNew(HController, t, r, bw)
>> log.info("** HController is running
>>
>> I am really sorry for any inconvenience caused. I, ve tried to make it a
>> bit clear here. I am not even able to debug the code by setting a python
>> debugging point pdb. I need help from you guys. Thanks a lot again for
>> your
>> time and help.
>>
>> Best Regards,
>> David
>>
>>
>> On Sat, May 9, 2015 at 12:07 PM, Mark Lawrence <breamoreboy at yahoo.co.uk>
>> wrote:
>>
>> On 09/05/2015 07:41, david jhon wrote:
>>>
>>> Hello everyone,
>>>>
>>>> I am new to python and trying to run an example code from mininet tests.
>>>> Basically, I am trying to call a method in Hcontroller.py from base
>>>> class
>>>> Routing defined in DCRouting.py which runs and fetches all the required
>>>> results in install_reactive_path() method, but it returns None when it
>>>> is
>>>> called from _GlobalFirstFit. I hope someone here could help me fix this
>>>> bug..
>>>>
>>>> I am attaching all the three files(DCRouting.py, HController.py,
>>>> util.py)
>>>> to have a look into. Thanks in advance for your time, help or
>>>> suggestion.
>>>> Thanks a lot!
>>>>
>>>> kind regards,
>>>> David
>>>>
>>>>
>>>> I'm sorry but I'm not wading through nearly 30kb of code in five
>>> attachments. Please see http://sscce.org/ for how to put your question
>>> so you're more likely to get answers.
>>>
>>> --
>>> My fellow Pythonistas, ask not what our language can do for you, ask
>>> what you can do for our language.
>>>
>>> Mark Lawrence
>>>
>>> --
>>> https://mail.python.org/mailman/listinfo/python-list
>>>
>>>
>>
>>
>>
>
> --
> DaveA
> --
> https://mail.python.org/mailman/listinfo/python-list
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20150509/ee92463b/attachment.html>
More information about the Python-list
mailing list