Add portOffset for multiple ONOSCluster port forwarding

With multiple ONOS clusters, we want to make sure that the
forwarded port numbers don't collide. We add a portOffset
which is automatically incremented appropriately as more
ONOSClusters are created. It can also be specified explicitly.

Change-Id: I62977c3d4141668d9f541067db1a20ec0035489b
diff --git a/tools/dev/mininet/onos.py b/tools/dev/mininet/onos.py
index d170caa..2fb6f94 100755
--- a/tools/dev/mininet/onos.py
+++ b/tools/dev/mininet/onos.py
@@ -369,19 +369,27 @@
 
 class ONOSCluster( Controller ):
     "ONOS Cluster"
+    # Offset for port forwarding
+    portOffset = 0
     def __init__( self, *args, **kwargs ):
         """name: (first parameter)
            *args: topology class parameters
            ipBase: IP range for ONOS nodes
-           forward: default port forwarding list,
+           forward: default port forwarding list
+           portOffset: offset to port base (optional)
            topo: topology class or instance
            nodeOpts: ONOSNode options
-           **kwargs: additional topology parameters"""
+           **kwargs: additional topology parameters
+        By default, multiple ONOSClusters will increment
+        the portOffset automatically; alternately, it can
+        be specified explicitly.
+        """
         args = list( args )
         name = args.pop( 0 )
         topo = kwargs.pop( 'topo', None )
         self.nat = kwargs.pop( 'nat', 'nat0' )
         nodeOpts = kwargs.pop( 'nodeOpts', {} )
+        self.portOffset = kwargs.pop( 'portOffset', ONOSCluster.portOffset )
         # Pass in kwargs to the ONOSNodes instead of the cluster
         "alertAction: exception|ignore|warn|exit (exception)"
         alertAction = kwargs.pop( 'alertAction', None )
@@ -408,6 +416,8 @@
             self.net.addNAT( self.nat ).configDefault()
         updateNodeIPs( self.env, self.nodes() )
         self._remoteControllers = []
+        # Update port offset for more ONOS clusters
+        ONOSCluster.portOffset += len( self.nodes() )
 
     def start( self ):
         "Start up ONOS cluster"
@@ -448,13 +458,13 @@
                   '-j ACCEPT' )
         for port in ports:
             for index, node in enumerate( self.nodes() ):
-                ip, inport = node.IP(), port + index
+                ip, inport = node.IP(), port + self.portOffset + index
                 # Configure a destination NAT rule
                 self.cmd( 'iptables -t nat -' + action,
                           'PREROUTING -t nat -p tcp --dport', inport,
                           '-j DNAT --to-destination %s:%s' % ( ip, port ) )
 
-                    
+
 class ONOSSwitchMixin( object ):
     "Mixin for switches that connect to an ONOSCluster"
     def start( self, controllers ):