10 from subprocess import call
11 from subprocess import check_output
12 from infrastructure_config import *
14 def addController(sw, ip):
15 call(['ovs-vsctl', 'set-controller', sw, 'tcp:%s:6653' % ip ])
18 cmd="ovs-vsctl set-manager tcp:%s:6640" % ip
20 print check_output(listcmd)
22 def addSwitch(name, dpid=None):
23 call(['ovs-vsctl', 'add-br', name]) #Add bridge
25 if len(dpid) < 16: #DPID must be 16-bytes in later versions of OVS
26 filler='0000000000000000'
27 dpid=filler[:len(filler)-len(dpid)]+dpid
29 print 'DPID: %s is too long' % dpid
31 call(['ovs-vsctl','set','bridge', name,'other-config:datapath-id=%s'%dpid])
33 def addHost(net, switch, name, ip, mac):
34 containerID=launchContainer()
36 def setOFVersion(sw, version='OpenFlow13,OpenFlow12,OpenFlow10'):
37 call(['ovs-vsctl', 'set', 'bridge', sw, 'protocols={}'.format(version)])
39 def addTunnel(sw, sourceIp=None):
40 ifaceName = '{}-vxlan-0'.format(sw)
41 cmd = ['ovs-vsctl', 'add-port', sw, ifaceName,
42 '--', 'set', 'Interface', ifaceName,
44 'options:remote_ip=flow',
46 # if sourceIp is not None:
47 # cmd.append('options:source_ip={}'.format(sourceIp))
50 def addGpeTunnel(sw, sourceIp=None):
51 ifaceName = '{}-vxlangpe-0'.format(sw)
52 cmd = ['ovs-vsctl', 'add-port', sw, ifaceName,
53 '--', 'set', 'Interface', ifaceName,
55 'options:remote_ip=flow',
56 'options:dst_port=6633',
64 # if sourceIp is not None:
65 # cmd.append('options:source_ip={}'.format(sourceIp))
68 def launchContainer(host,containerImage):
69 containerID= check_output(['docker','run','-d','--net=none','--name=%s'%host['name'],'-h',host['name'],'-t', '-i','--privileged=True',containerImage,'/bin/bash']) #docker run -d --net=none --name={name} -h {name} -t -i {image} /bin/bash
70 #print "created container:", containerID[:-1]
71 return containerID[:-1] #Remove extraneous \n from output of above
73 def connectContainerToSwitch(sw,host,containerID,of_port):
76 nw = ipaddr.IPv4Network(hostIP)
77 broadcast = "{}".format(nw.broadcast)
78 router = "{}".format(nw.network + 1)
79 cmd=['/vagrant/ovswork.sh',sw,containerID,hostIP,broadcast,router,mac,of_port,host['name']]
80 if host.has_key('vlan'):
81 cmd.append(host['vlan'])
86 print check_output(listcmd)
88 def launch(switches, hosts, contIP='127.0.0.1'):
95 if host['switch'] == sw['name']:
98 addSwitch(sw['name'],sw['dpid'])
99 setOFVersion(sw['name'])
100 addController(sw['name'], contIP)
101 addGpeTunnel(sw['name'])
102 addTunnel(sw['name'])
104 containerImage=defaultContainerImage #from Config
105 if host.has_key('container_image'): #from Config
106 containerImage=host['container_image']
107 containerID=launchContainer(host,containerImage)
109 connectContainerToSwitch(sw['name'],host,containerID,str(ports))
110 host['port-name']='vethl-'+host['name']
111 print "Created container: %s with IP: %s. Connect using 'docker attach %s', disconnect with ctrl-p-q." % (host['name'],host['ip'],host['name'])
113 if __name__ == "__main__" :
114 # print "Cleaning environment..."
115 # doCmd('/vagrant/clean.sh')
116 sw_index=int(socket.gethostname().split("gbpsfc",1)[1])-1
117 if sw_index in range(0,len(switches)+1):
119 controller=os.environ.get('ODL')
120 sw_type = switches[sw_index]['type']
121 sw_name = switches[sw_index]['name']
123 print "*****************************"
124 print "Configuring %s as a GBP node." % sw_name
125 print "*****************************"
127 launch([switches[sw_index]],hosts,controller)
128 print "*****************************"
132 doCmd('ovs-vsctl show')
134 print "Docker containers:"
135 print "------------------"
137 print "*****************************"
138 elif sw_type == 'sff':
139 print "*****************************"
140 print "Configuring %s as an SFF." % sw_name
141 print "*****************************"
142 doCmd('sudo ovs-vsctl set-manager tcp:%s:6640' % controller)
144 elif sw_type == 'sf':
145 print "*****************************"
146 print "Configuring %s as an SF." % sw_name
147 print "*****************************"
148 doCmd('sudo /vagrant/sf-config.sh')
149 #addGpeTunnel(switches[sw_index]['name'])