calling base class method fetches no results

david jhon djhon9813 at gmail.com
Sat May 9 03:59:20 EDT 2015


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:

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)

============================> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20150509/8466c240/attachment.html>


More information about the Python-list mailing list