#!/usr/bin/python

"""
Build a simple network from scratch, using mininet primitives.
This is more complicated than using the higher-level classes,
but it exposes the configuration details and allows customization.
"""

import logging

from mininet.net import init
from mininet.node import Node
from mininet.util import createLink
from mininet.log import info

# print out info() messages, including cmdPrint
logging.LOGLEVELDEFAULT = logging.INFO

def scratchNet( cname='controller', cargs='ptcp:'):
    # Create Network
    print "*** creating Nodes"
    controller = Node( 'c0', inNamespace=False )
    switch = Node( 's0', inNamespace=False )
    h0 = Node( 'h0' )
    h1 = Node( 'h1' )
    print "*** creating links"
    createLink( node1=h0, port1=0, node2=switch, port2=0 )
    createLink( node1=h1, port1=0, node2=switch, port2=1 )
    # Configure hosts
    print "*** configuring hosts"
    h0.setIP( h0.intfs[ 0 ], '192.168.123.1', '/24' )
    h1.setIP( h1.intfs[ 0 ], '192.168.123.2', '/24' )
    print h0
    print h1
    # Start network using kernel datapath
    controller.cmdPrint( cname + ' ' + cargs + '&' )
    switch.cmdPrint( 'dpctl deldp nl:0' )
    switch.cmdPrint( 'dpctl adddp nl:0' )
    for intf in switch.intfs.values():
      switch.cmdPrint( 'dpctl addif nl:0 ' + intf )
    switch.cmdPrint( 'ofprotocol nl:0 tcp:localhost &')
    # Run test
    print h0.cmd( 'ping -c1 ' + h1.IP() )
    # Stop network
    controller.cmdPrint( 'kill %' + cname)
    switch.cmdPrint( 'dpctl deldp nl:0' )
    switch.cmdPrint( 'kill %ofprotocol' )
    switch.stop()
    controller.stop()
   
if __name__ == '__main__':
    info( '*** Scratch network demo\n' )
    init()   
    scratchNet()