Mininet在创建拓扑的过程中为什么不打印信息了——了解Mininet的log系统

前言

写这篇博客是为了给我的愚蠢和浪费的6个小时买单!

过程原因分析

我用Mininet创建过不少拓扑了,这次创建的拓扑非常简单,如下图,创建拓扑的代码见github。在以前的拓扑创建过程中,我都是用标准模板去修改一些逻辑,主要包括创建的拓扑逻辑和建好拓扑之后的一些测试代码,这次由于代码比较简单,所以基本都是从头开始写的。

	                  1   3
	         |---------sw2--------|
	         |          |2        |
	        1|2         |         |1
	h1------sw1         |        sw4-------h2
	         |3         |        3|  2
	         |          |3        |
	         |---------sw3--------|
                      1  2 

很快写好了源码,直接运行,却发现在经过一小段时间时候直接跳入Mininet交互界面,我输入了nodes,也显示出了所有的交换机主机和控制器,输入links也显示链路正常,但是却不出现以前熟悉的adding hosts, adding switches等这些熟悉的提示信息,所以以为拓扑建的有问题,修改了一些无伤大雅的代码之后,发现还是同样的问题,所以拿出了之前的代码,比较,修改,运行,比较,修改,运行,但是却总是不打印信息,搞了好久,终于在最后注意到了平时的一句代码setLogLevel("info"),而我一直忽略他,所以就顺便了解下Mininet的log结构。
Mininet的log等级并没有什么难度,直接使用的python的logging模块,python的logging模块分六个等级:

  • notest
  • debug
  • info
  • warning
  • error
  • critical

这些级别其实对应的都是一个值,在上面的六个等级中,从上到下值依次递增,比如从0到50,在Mininet中,除了上面六个,新增加了一个值为25d的OUTPUT层,而且这层是Mininet的默认log层,即在创建拓扑的代码中要是没有用setLogLevel()函数来指定其他的日志等级,那么OUTPUT便是默认的等,OUTPUT介于info和warning之间,Mininet称之为CLI info,即他只允许用户看到Mininet对自己命令的相应,也就是我上面说的在Mininet CLI界面下输入nodes这些命令,他是有输出信息的,所以提醒大家在使用Mininet的时候注意他的日志系统。

刚刚有人咨询我Mininet建立拓扑的问题,对于熟悉Mininet的人来说,用Mininet模拟网络更多的工作是如何组织拓扑,如何利用list,dict或者其他文件处理数据来达到自己的目的,但对于初学者,简单的拓扑可能更便于学习,所以我将这个简单拓扑的源码附在下面:

#coding="utf-8"
from os import getuid

from mininet.log import lg, info, setLogLevel
from mininet.cli import CLI
from mininet.net import Mininet
from mininet.topo import Topo
from mininet.link import Link, Intf
from mininet.node import Host, OVSKernelSwitch, Controller, RemoteController

class LisaTopo( Topo ):
    "Topology for LISA"

    def __init__( self ):
        #super(LisaTopo, self).__init__()
        Topo.__init__(self)

        # Set topology info
        hosts = [1, 2]
        switches = [1, 2, 3, 4]
        links = [{(1, 2):(2, 1)}, {(1, 3):(3, 1)}, {(2, 3):(2, 3)}, {(2, 4):(3, 1)}, {(3, 4):(2, 3)}]
        links_sw_host = [{(1, 1):(1, 1)}, {(2, 4):(1, 2)}]
		

        # Wire up switches       
        for link in links:
            s1 = self.addSwitch("s%s" % link.keys()[0][0])
	    s2 = self.addSwitch("s%s" % link.keys()[0][1])
            self.addLink(s1, s2 , link.values()[0][0], link.values()[0][1])
        
        # Wire up hosts
        for link in links_sw_host:
            h1 = self.addHost("h%s" % link.keys()[0][0])
	    s2 = self.addSwitch("s%s" % link.keys()[0][1])
            self.addLink(h1, s2 , link.values()[0][0], link.values()[0][1])

                
       
def LisaTopoTest():
    topo = LisaTopo()
    main_controller = lambda a:RemoteController(a, ip="localhost",port=6633)
    net = Mininet( topo=topo, switch=OVSKernelSwitch, controller=main_controller)
    
    
    net.start()
    
        
    CLI( net )
    net.stop()

if __name__ == '__main__':
    if getuid()!=0:
        print "Please run this script as root / use sudo."
        exit(-1)
    setLogLevel("info")

    LisaTopoTest()
    

总结

posted @ 2016-03-14 14:53  cotyb  阅读(1301)  评论(0编辑  收藏  举报
AmazingCounters.com