Modifying hybrid_v4 topology to mirror ONS-EU 2018 demo topology
Change-Id: I37e2d705bc8ee70ee3dd2795263af43206f38d5b
diff --git a/trellis/dhcpd_hybrid_v4.conf b/trellis/dhcpd_hybrid_v4.conf
new file mode 100644
index 0000000..02a0e07
--- /dev/null
+++ b/trellis/dhcpd_hybrid_v4.conf
@@ -0,0 +1,86 @@
+ddns-update-style none;
+
+default-lease-time 600;
+max-lease-time 7200;
+
+option domain-name-servers 8.8.8.8, 8.8.4.4;
+option domain-name "trellis.local";
+
+subnet 10.0.2.0 netmask 255.255.255.0 {
+ range 10.0.2.100 10.0.2.240;
+ option routers 10.0.2.254;
+}
+
+subnet 10.1.2.0 netmask 255.255.255.0 {
+ range 10.1.2.100 10.1.2.240;
+ option routers 10.1.2.254;
+}
+
+subnet 10.0.3.0 netmask 255.255.255.0 {
+ range 10.0.3.100 10.0.3.240;
+ option routers 10.0.3.254;
+}
+
+subnet 10.0.4.0 netmask 255.255.255.0 {
+ range 10.0.4.100 10.0.4.240;
+ option routers 10.0.4.254;
+}
+
+subnet 10.0.99.3 netmask 255.255.255.255 {
+}
+
+subnet 10.5.6.0 netmask 255.255.255.0 {
+ range 10.5.6.100 10.5.6.240;
+ option routers 10.5.6.254;
+}
+
+subnet 10.11.1.0 netmask 255.255.255.0 {
+ range 10.11.1.100 10.11.1.240;
+ option routers 10.11.1.254;
+}
+
+subnet 10.11.2.0 netmask 255.255.255.0 {
+ range 10.11.2.100 10.11.2.240;
+ option routers 10.11.2.254;
+}
+
+
+host h1 {
+ hardware ethernet 00:aa:00:00:00:01;
+ fixed-address 10.11.1.5;
+}
+
+host h2 {
+ hardware ethernet 00:aa:00:00:00:02;
+ fixed-address 10.11.2.15;
+}
+
+host h3 {
+ hardware ethernet 00:aa:00:00:00:03;
+ fixed-address 10.0.4.1;
+}
+
+host h4 {
+ hardware ethernet 00:aa:00:00:00:04;
+ fixed-address 10.0.2.2;
+}
+
+host h5 {
+ hardware ethernet 00:aa:00:00:00:05;
+ fixed-address 10.0.3.1;
+}
+
+host h6 {
+ hardware ethernet 00:aa:00:00:00:06;
+ fixed-address 10.0.3.2;
+}
+
+host dh1 {
+ hardware ethernet 00:cc:00:00:00:01;
+ fixed-address 10.1.2.1;
+}
+
+host dh2 {
+ hardware ethernet 00:cc:00:00:00:02;
+ fixed-address 10.5.6.1;
+}
diff --git a/trellis/trellis_hybrid_v4.json b/trellis/trellis_hybrid_v4.json
index 1bfbc15..ada4ba6 100644
--- a/trellis/trellis_hybrid_v4.json
+++ b/trellis/trellis_hybrid_v4.json
@@ -11,7 +11,7 @@
"of:0000000000000203/6" : {
"interfaces" : [
{
- "name": "h5-eth0",
+ "name": "h3-eth0",
"ips" : [ "10.0.4.254/24" ],
"vlan-untagged": 22
}
@@ -26,7 +26,7 @@
}
]
},
- "device:s204/5" : {
+ "device:bmv2-s204/5" : {
"interfaces" : [
{
"ips" : [ "10.1.2.254/24"],
@@ -34,25 +34,16 @@
}
]
},
- "device:s204/6" : {
+ "device:bmv2-s204/6" : {
"interfaces" : [
{
- "name": "h1-eth0",
+ "name": "h4-eth0",
"ips" : [ "10.0.2.254/24" ],
"vlan-untagged": 20
}
]
},
- "device:s204/7" : {
- "interfaces" : [
- {
- "name": "h2-eth0",
- "ips" : [ "10.0.2.254/24" ],
- "vlan-untagged": 20
- }
- ]
- },
- "device:s204/8" : {
+ "device:bmv2-s204/7" : {
"interfaces" : [
{
"name": "dh1-eth0",
@@ -61,19 +52,18 @@
}
]
},
- "of:0000000000000205/8" : {
+ "of:0000000000000205/5" : {
"interfaces" : [
{
- "name": "cs1 - dhcp - eth0",
- "ips" : [ "10.0.3.254/24" ],
- "vlan-untagged": 30
+ "ips" : [ "10.5.6.254/24" ],
+ "vlan-tagged": [56]
}
]
},
"of:0000000000000205/6" : {
"interfaces" : [
{
- "name": "h3-eth0",
+ "name": "h5-eth0",
"ips" : [ "10.0.3.254/24" ],
"vlan-untagged": 30
}
@@ -82,31 +72,13 @@
"of:0000000000000205/7" : {
"interfaces" : [
{
- "name": "h4-eth0",
- "ips" : [ "10.0.3.254/24"],
+ "name": "h6-eth0",
+ "ips" : [ "10.0.3.254/24" ],
"vlan-untagged": 30
}
]
},
- "of:0000000000000205/9" : {
- "interfaces" : [
- {
- "name": "bgp1-eth0",
- "ips" : [ "10.0.1.254/24"],
- "vlan-tagged": [110]
- }
- ]
- },
- "of:0000000000000205/10" : {
- "interfaces" : [
- {
- "name": "r1-eth0",
- "ips" : [ "10.0.1.254/24"],
- "vlan-untagged": 110
- }
- ]
- },
- "of:0000000000000205/11" : {
+ "of:0000000000000205/8" : {
"interfaces" : [
{
"name": "dh2-eth0",
@@ -115,11 +87,30 @@
}
]
},
- "of:0000000000000205/5" : {
+ "of:0000000000000205/9" : {
"interfaces" : [
{
- "ips" : [ "10.5.6.254/24" ],
- "vlan-tagged": [56]
+ "name": "cs1 - dhcp - eth0",
+ "ips" : [ "10.0.3.254/24" ],
+ "vlan-untagged": 30
+ }
+ ]
+ },
+ "of:0000000000000205/10" : {
+ "interfaces" : [
+ {
+ "name": "bgp1-eth0",
+ "ips" : [ "10.0.1.254/24"],
+ "vlan-tagged": [110]
+ }
+ ]
+ },
+ "of:0000000000000205/11" : {
+ "interfaces" : [
+ {
+ "name": "r1-eth0",
+ "ips" : [ "10.0.1.254/24"],
+ "vlan-untagged": 110
}
]
},
@@ -134,15 +125,6 @@
"of:0000000000000206/6" : {
"interfaces" : [
{
- "name": "bgp2-eth0",
- "ips" : [ "10.0.6.254/24"],
- "vlan-tagged": [160]
- }
- ]
- },
- "of:0000000000000206/8" : {
- "interfaces" : [
- {
"name": "dh2-eth1",
"ips" : [ "10.5.6.254/24"],
"vlan-untagged": 56
@@ -152,6 +134,16 @@
"of:0000000000000206/7" : {
"interfaces" : [
{
+ "name": "bgp2-eth0",
+ "ips" : [ "10.0.6.254/24"],
+ "vlan-tagged": [160]
+ }
+ ]
+ },
+
+ "of:0000000000000206/8" : {
+ "interfaces" : [
+ {
"name": "r2-eth0",
"ips" : [ "10.0.6.254/24"],
"vlan-untagged": 160
@@ -162,16 +154,16 @@
"of:0000000000000207/3" : {
"interfaces" : [
{
- "name": "rpd5-eth0",
+ "name": "h1-eth0",
"ips" : [ "10.11.1.254/24" ],
"vlan-untagged": 1000
}
]
},
- "device:s208/3" : {
+ "device:bmv2-s208/3" : {
"interfaces" : [
{
- "name": "rpd6-eth0",
+ "name": "h2-eth0",
"ips" : [ "10.11.2.254/24" ],
"vlan-untagged": 1002
}
@@ -181,25 +173,22 @@
"devices" : {
"of:0000000000000203" : {
"segmentrouting" : {
- "name" : "s203",
+ "name" : "ovs-s203",
"ipv4NodeSid" : 203,
"ipv4Loopback" : "192.168.0.203",
"routerMac" : "00:00:00:00:02:03",
"isEdgeRouter" : true,
- "pairDeviceId" : "device:s204",
+ "pairDeviceId" : "device:bmv2-s204",
"pairLocalPort" : 5,
"adjacencySids" : []
},
"basic" : {
- "name": "s203",
- "driver" : "ofdpa-ovs",
- "latitude" : "36.766",
- "longitude" : "-111.359"
+ "driver" : "ofdpa-ovs"
}
},
- "device:s204" : {
+ "device:bmv2-s204" : {
"segmentrouting" : {
- "name" : "s204",
+ "name" : "bmv2-s204",
"ipv4NodeSid" : 204,
"ipv4Loopback" : "192.168.0.204",
"routerMac" : "00:00:00:00:02:03",
@@ -207,16 +196,11 @@
"pairDeviceId" : "of:0000000000000203",
"pairLocalPort" : 5,
"adjacencySids" : []
- },
- "basic" : {
- "name": "s204",
- "latitude" : "36.766",
- "longitude" : "-106.359"
}
},
"of:0000000000000205" : {
"segmentrouting" : {
- "name" : "s205",
+ "name" : "ovs-s205",
"ipv4NodeSid" : 205,
"ipv4Loopback" : "192.168.0.205",
"routerMac" : "00:00:00:00:02:05",
@@ -226,16 +210,12 @@
"pairLocalPort": 5
},
"basic" : {
- "name": "s205",
- "driver" : "ofdpa-ovs",
- "latitude" : "36.766",
- "longitude" : "-96.89"
-
+ "driver" : "ofdpa-ovs"
}
},
"of:0000000000000206" : {
"segmentrouting" : {
- "name" : "s206",
+ "name" : "ovs-s206",
"ipv4NodeSid" : 206,
"ipv4Loopback" : "192.168.0.206",
"routerMac" : "00:00:00:00:02:05",
@@ -245,30 +225,22 @@
"pairLocalPort": 5
},
"basic" : {
- "name": "s206",
- "driver" : "ofdpa-ovs",
- "latitude" : "36.766",
- "longitude" : "-92.029"
+ "driver" : "ofdpa-ovs"
}
},
- "device:s226" : {
+ "device:bmv2-s226" : {
"segmentrouting" : {
- "name" : "s226",
+ "name" : "ovs-s226",
"ipv4NodeSid" : 226,
"ipv4Loopback" : "192.168.0.226",
"routerMac" : "00:00:00:00:02:26",
"isEdgeRouter" : false,
"adjacencySids" : []
- },
- "basic" : {
- "name": "s226",
- "latitude" : "44.15",
- "longitude" : "-107.679"
}
},
"of:0000000000000227" : {
"segmentrouting" : {
- "name" : "s227",
+ "name" : "ovs-s227",
"ipv4NodeSid" : 227,
"ipv4Loopback" : "192.168.0.227",
"routerMac" : "00:00:00:00:02:27",
@@ -276,17 +248,13 @@
"adjacencySids" : []
},
"basic" : {
- "name": "s227",
- "driver" : "ofdpa-ovs",
- "latitude" : "44.205",
- "longitude" : "-96.359"
-
+ "driver" : "ofdpa-ovs"
}
},
"of:0000000000000207" : {
"segmentrouting" : {
- "name" : "s207",
+ "name" : "ovs-s207",
"ipv4NodeSid" : 207,
"ipv4Loopback" : "192.168.0.207",
"routerMac" : "00:00:00:00:02:07",
@@ -294,68 +262,146 @@
"adjacencySids" : []
},
"basic" : {
- "name": "s207",
- "driver" : "ofdpa-ovs",
- "latitude" : "36.766",
- "longitude" : "-122.359"
+ "driver" : "ofdpa-ovs"
}
},
- "device:s208" : {
+ "device:bmv2-s208" : {
"segmentrouting" : {
- "name" : "s208",
+ "name" : "bmv2-s208",
"ipv4NodeSid" : 208,
"ipv4Loopback" : "192.168.0.208",
"routerMac" : "00:00:00:00:02:08",
"isEdgeRouter" : true,
"adjacencySids" : []
- },
- "basic" : {
- "name": "s208",
- "latitude" : "36.766",
- "longitude" : "-116.029"
}
},
- "device:s246" : {
+ "device:bmv2-s246" : {
"segmentrouting" : {
- "name" : "s246",
+ "name" : "bmv2-s246",
"ipv4NodeSid" : 246,
"ipv4Loopback" : "192.168.0.246",
"routerMac" : "00:00:00:00:02:46",
"isEdgeRouter" : false,
"adjacencySids" : []
- },
- "basic" : {
- "name": "s246",
- "latitude" : "40.15",
- "longitude" : "-121.679"
}
},
- "device:s247" : {
+ "device:bmv2-s247" : {
"segmentrouting" : {
- "name" : "s247",
+ "name" : "bmv2-s247",
"ipv4NodeSid" : 247,
"ipv4Loopback" : "192.168.0.247",
"routerMac" : "00:00:00:00:02:47",
"isEdgeRouter" : false,
"adjacencySids" : []
- },
- "basic" : {
- "name": "s247",
- "latitude" : "40.205",
- "longitude" : "-117.359"
-
}
}
-
},
"apps" : {
"org.onosproject.dhcprelay" : {
"default": [
{
- "dhcpServerConnectPoint": "of:0000000000000205/8",
+ "dhcpServerConnectPoint": "of:0000000000000205/9",
"serverIps": ["10.0.3.253"]
}
]
}
+ },
+ "hosts": {
+ "00:DD:00:00:00:01/None": {
+ "basic": {
+ "name": "Host 1",
+ "latitude": "49",
+ "longitude": "-105"
+ }
+ },
+ "00:DD:00:00:00:02/None": {
+ "basic": {
+ "name": "Host 2",
+ "latitude": "49",
+ "longitude": "-95"
+ }
+ },
+ "00:AA:00:00:00:03/None": {
+ "basic": {
+ "name": "Host 3",
+ "latitude": "33",
+ "longitude": "-110"
+ }
+ },
+ "00:AA:00:00:00:04/None": {
+ "basic": {
+ "name": "Host 4",
+ "latitude": "33",
+ "longitude": "-105"
+ }
+ },
+ "00:AA:00:00:00:05/None": {
+ "basic": {
+ "name": "Host 5",
+ "latitude": "33",
+ "longitude": "-95"
+ }
+ },
+ "00:AA:00:00:00:06/None": {
+ "basic": {
+ "name": "Host 6",
+ "latitude": "33",
+ "longitude": "-92.5"
+ }
+ },
+ "00:CC:00:00:00:01/None": {
+ "basic": {
+ "name": "Dual Homed Host 1",
+ "latitude": "31",
+ "longitude": "-107.5"
+ }
+ },
+ "00:CC:00:00:00:02/None": {
+ "basic": {
+ "name": "Dual Homed Host 2",
+ "latitude": "31",
+ "longitude": "-92.5"
+ }
+ },
+ "00:99:00:00:00:01/None": {
+ "basic": {
+ "name": "DHCP Server",
+ "latitude": "33",
+ "longitude": "-98"
+ }
+ },
+ "00:88:00:00:00:01/None": {
+ "basic": {
+ "name": "Upstream Router 1",
+ "latitude": "39",
+ "longitude": "-85",
+ "uiType": "m_router"
+ }
+ },
+ "00:88:00:00:00:02/None": {
+ "basic": {
+ "name": "Upstream Router 2",
+ "latitude": "37",
+ "longitude": "-85",
+ "uiType": "m_router"
+ }
+ },
+
+ "00:88:00:00:00:03/110": {
+ "basic": {
+ "name": "Quagga 1",
+ "latitude": "35",
+ "longitude": "-98",
+ "uiType": "m_bgpSpeaker"
+ }
+ },
+ "00:88:00:00:00:04/160": {
+ "basic": {
+ "name": "Quagga 2",
+ "latitude": "33",
+ "longitude": "-90",
+ "uiType": "m_bgpSpeaker"
+ }
+ }
}
}
diff --git a/trellis/trellis_hybrid_v4.py b/trellis/trellis_hybrid_v4.py
index c5135ca..1f45088 100755
--- a/trellis/trellis_hybrid_v4.py
+++ b/trellis/trellis_hybrid_v4.py
@@ -1,6 +1,10 @@
#!/usr/bin/python
import argparse
import sys
+import os
+import json
+import random
+import urllib2
sys.path.append('..')
from mininet.topo import Topo
from mininet.cli import CLI
@@ -12,7 +16,6 @@
from routinglib import RoutedHost
from trellislib import DhcpClient, DhcpServer
from trellislib import DualHomedDhcpClient
-from trellislib import DualHomedDhcp4and6Client
from trellislib import get_mininet, set_up_zebra_config
from functools import partial
@@ -37,14 +40,16 @@
Topo.__init__(self, *args, **kwargs)
# Spines
- s226 = self.addSwitch(**self.get_p4_switch_args('s226'))
- s227 = self.addSwitch('s227', dpid='227')
+ s226 = self.addSwitch(latitude="39", longitude="-105",
+ **self.get_p4_switch_args('bmv2-s226'))
+ s227 = self.addSwitch('ovs-s227', dpid='227', latitude="39",longitude="-95")
# Leaves
- s203 = self.addSwitch('s203', dpid='203')
- s204 = self.addSwitch(**self.get_p4_switch_args('s204'))
- s205 = self.addSwitch('s205', dpid='205')
- s206 = self.addSwitch('s206', dpid='206')
+ s203 = self.addSwitch('ovs-s203', dpid='203', latitude="35",longitude="-110")
+ s204 = self.addSwitch(latitude="35", longitude="-105",
+ **self.get_p4_switch_args('bmv2-s204'))
+ s205 = self.addSwitch('ovs-s205', dpid='205', latitude="35",longitude="-95")
+ s206 = self.addSwitch('ovs-s206', dpid='206', latitude="35",longitude="-90")
# Leaf-Spine Links
self.addLink(s226, s203)
@@ -71,45 +76,34 @@
# NOTE avoid using 10.0.1.0/24 which is the default subnet of quaggas
# NOTE avoid using 00:00:00:00:00:xx which is the default mac of host behind upstream router
# IPv4 Hosts
- h1 = self.addHost('h1', cls=DhcpClient, mac='00:aa:00:00:00:01')
- h2 = self.addHost('h2', cls=DhcpClient, mac='00:aa:00:00:00:02')
h3 = self.addHost('h3', cls=DhcpClient, mac='00:aa:00:00:00:03')
h4 = self.addHost('h4', cls=DhcpClient, mac='00:aa:00:00:00:04')
h5 = self.addHost('h5', cls=DhcpClient, mac='00:aa:00:00:00:05')
- self.addLink(h1, s204)
- self.addLink(h2, s204)
- self.addLink(h3, s205)
- self.addLink(h4, s205)
- self.addLink(h5, s203)
+ h6 = self.addHost('h6', cls=DhcpClient, mac='00:aa:00:00:00:06')
+ self.addLink(h3, s203)
+ self.addLink(h4, s204)
+ self.addLink(h5, s205)
+ self.addLink(h6, s205)
- # IPv6 Hosts
- #h1v6 = self.addHost('h1v6', cls=Dhcp6Client, mac='00:bb:00:00:00:01')
- #h2v6 = self.addHost('h2v6', cls=Dhcp6Client, mac='00:bb:00:00:00:02')
- #h3v6 = self.addHost('h3v6', cls=Dhcp6Client, mac='00:bb:00:00:00:03')
- #h4v6 = self.addHost('h4v6', cls=Dhcp6Client, mac='00:bb:00:00:00:04')
- #h5v6 = self.addHost('h5v6', cls=Dhcp6Client, mac='00:bb:00:00:00:05')
- #self.addLink(h1v6, s204)
- #self.addLink(h2v6, s204)
- #self.addLink(h3v6, s205)
- #self.addLink(h4v6, s205)
- #self.addLink(h5v6, s203)
-
- # Dual-homed IPv4 and IPv6 Host on 203-204
- dh1 = self.addHost('dh1', cls=DualHomedDhcp4and6Client, mac='00:cc:00:00:00:01')
+ # Dual-homed IPv4 Host on 203-204
+ dh1 = self.addHost('dh1', cls=DualHomedDhcpClient, mac='00:cc:00:00:00:01')
self.addLink(dh1, s204)
self.addLink(dh1, s203)
- # DHCP server
- dhcp = self.addHost('dhcp', cls=DhcpServer, mac='00:99:00:00:00:01', ips=['10.0.3.253/24'], gateway='10.0.3.254')
+ # Dual-homed IPv4 Host for 205-206
+ dh2 = self.addHost('dh2', cls=DualHomedDhcpClient, mac='00:cc:00:00:00:02')
+ self.addLink(dh2, s205)
+ self.addLink(dh2, s206)
- # DHCPv6 server
- #dhcp6 = self.addHost('dhcp6', cls=Dhcp6Server, mac='00:99:66:00:00:01', ips=['2000::3fd/120'], gateway='2000::3ff')
+ # DHCP server
+ dhcp = self.addHost('dhcp', cls=DhcpServer, mac='00:99:00:00:00:01',
+ ips=['10.0.3.253/24'], gateway='10.0.3.254',
+ configFile='./dhcpd_hybrid_v4.conf')
# Dataplane L2 plane switch (for DHCP servers)
cs1 = self.addSwitch('cs1', cls=OVSBridge)
self.addLink(cs1, s205)
self.addLink(dhcp, cs1)
- #self.addLink(dhcp6, cs1)
# Control plane switch (for quagga fpm)
cs0 = self.addSwitch('cs0', cls=OVSBridge)
@@ -163,14 +157,6 @@
rh1 = self.addHost('rh1', cls=RoutedHost, ips=['10.0.99.2/24'], gateway='10.0.99.1')
self.addLink(r1, rh1)
- # External IPv6 Host behind r1
- #rh1v6 = self.addHost('rh1v6', cls=RoutedHost, ips=['2000::9902/120'], gateway='2000::9901')
- #self.addLink(r1, rh1v6)
-
- # Another external IPv6 Host behind r1
- #rh11v6 = self.addHost('rh11v6', cls=RoutedHost, ips=['2000::7702/120'], gateway='2000::7701')
- #self.addLink(r1, rh11v6)
-
# External Quagga r2
intfs = {'r2-eth0': {'ipAddrs': ['10.0.6.1/24'], 'mac': '00:88:00:00:00:02'},
'r2-eth1': {'ipAddrs': ['10.0.99.1/16']}}
@@ -184,28 +170,18 @@
rh2 = self.addHost('rh2', cls=RoutedHost, ips=['10.0.99.2/24'], gateway='10.0.99.1')
self.addLink(r2, rh2)
- # External IPv6 Host behind r2
- #rh2v6 = self.addHost('rh126', cls=RoutedHost, ips=['2000::9902/120'], gateway='2000::9901')
- #self.addLink(r2, rh2v6)
-
- # Another external IPv6 Host behind r1
- #rh22v6 = self.addHost('rh22v6', cls=RoutedHost, ips=['2000::8802/120'], gateway='2000::8801')
- #self.addLink(r2, rh22v6)
-
- # Dual-homed IPv4 Host for 205-206
- dh2 = self.addHost('dh2', cls=DualHomedDhcpClient, mac='00:cc:00:00:00:02')
- self.addLink(dh2, s205)
- self.addLink(dh2, s206)
-
# ----- Secondary fabric -----
# Spines(HAG)
- s246 = self.addSwitch(**self.get_p4_switch_args('s246'))
- s247 = self.addSwitch(**self.get_p4_switch_args('s247'))
+ s246 = self.addSwitch(latitude="44", longitude="-105",
+ **self.get_p4_switch_args('bmv2-s246'))
+ s247 = self.addSwitch(latitude="44", longitude="-95",
+ **self.get_p4_switch_args('bmv2-s247'))
# Leaves(DAAS)
- s207 = self.addSwitch('s207', dpid='207')
- s208 = self.addSwitch(**self.get_p4_switch_args('s208'))
+ s207 = self.addSwitch('ovs-s207', dpid='207', latitude="47", longitude="-105")
+ s208 = self.addSwitch(latitude="47", longitude="-95",
+ **self.get_p4_switch_args('bmv2-s208'))
# HAG-DAAS Links
self.addLink(s246, s207)
@@ -218,23 +194,83 @@
self.addLink(s247, s227)
# IPv4 Hosts - RPDs
- rpd5 = self.addHost('rpd5', cls=DhcpClient, mac='00:dd:00:00:00:01')
- rpd6 = self.addHost('rpd6', cls=DhcpClient, mac='00:dd:00:00:00:02')
- self.addLink(rpd5, s207)
- self.addLink(rpd6, s208)
-
- # IPv6 Hosts - RPDs
- #rpd5v6 = self.addHost('rpd5v6', cls=Dhcp6Client, mac='00:ee:00:00:00:01')
- #rpd6v6 = self.addHost('rpd6v6', cls=Dhcp6Client, mac='00:ee:00:00:00:02')
- #self.addLink(rpd5v6, s207)
- #self.addLink(rpd6v6, s208)
-
+ h1 = self.addHost('h1', cls=DhcpClient, mac='00:dd:00:00:00:01')
+ h2 = self.addHost('h2', cls=DhcpClient, mac='00:dd:00:00:00:02')
+ self.addLink(h1, s207)
+ self.addLink(h2, s208)
topos = { 'trellis' : Trellis }
+class ONOSOVSSwitch( OVSSwitch ):
+ """OVSSwitch that generates and pushes config to ONOS"""
+
+ def __init__(self, name, netcfg=True, **kwargs):
+ OVSSwitch.__init__(self, name, **kwargs)
+ self.netcfg = netcfg in (True, '1', 'true', 'True')
+ self.netcfgfile = '/tmp/ovs-%s-netcfg.json' % self.name
+ self.onosDeviceId = 'of:%s' % self.dpid
+ self.longitude = kwargs['longitude'] if 'longitude' in kwargs else None
+ self.latitude = kwargs['latitude'] if 'latitude' in kwargs else None
+
+ @staticmethod
+ def controllerIp(controllers):
+ try:
+ clist = controllers[0].nodes()
+ except AttributeError:
+ clist = controllers
+ assert len(clist) > 0
+ return random.choice(clist).IP()
+
+ def start(self, controllers):
+ """
+ Starts the switch, then notifies ONOS about the new device via Netcfg.
+ """
+ OVSSwitch.start(self, controllers)
+
+ if not self.netcfg:
+ # Do not push config to ONOS.
+ return
+
+ controllerIP = self.controllerIp(controllers)
+
+ basicCfg = {
+ "name": self.name,
+ "driver": "ofdpa-ovs"
+ }
+
+ if self.longitude and self.latitude:
+ basicCfg["longitude"] = self.longitude
+ basicCfg["latitude"] = self.latitude
+
+ cfgData = {
+ "devices": {
+ self.onosDeviceId: { "basic": basicCfg }
+ }
+ }
+ with open(self.netcfgfile, 'w') as fp:
+ json.dump(cfgData, fp, indent=4)
+
+ # Build netcfg URL
+ url = 'http://%s:8181/onos/v1/network/configuration/' % controllerIP
+ # Instantiate password manager for HTTP auth
+ pm = urllib2.HTTPPasswordMgrWithDefaultRealm()
+ user = os.environ['ONOS_WEB_USER'] if 'ONOS_WEB_USER' in os.environ else 'onos'
+ password = os.environ['ONOS_WEB_PASS'] if 'ONOS_WEB_PASS' in os.environ else 'rocks'
+ pm.add_password(None, url, user, password)
+ urllib2.install_opener(urllib2.build_opener(urllib2.HTTPBasicAuthHandler(pm)))
+ try:
+ # Push config data to controller
+ req = urllib2.Request(url, json.dumps(cfgData),
+ {'Content-Type': 'application/json'})
+ f = urllib2.urlopen(req)
+ print f.read()
+ f.close()
+ except urllib2.URLError as e:
+ warn("*** WARN: unable to push config to ONOS (%s)\n" % e.reason)
+
if __name__ == "__main__":
- setLogLevel('debug')
+ setLogLevel('info')
parser = argparse.ArgumentParser(description="Trellis Arguments")
parser.add_argument("-c", "--controllers", help = "Comma Separated List of ONOS controllers",
@@ -254,7 +290,7 @@
set_up_zebra_config(arguments.controllers)
topo = Trellis()
- switch = partial(OVSSwitch, protocols='OpenFlow13')
+ switch = partial(ONOSOVSSwitch, protocols='OpenFlow13')
net = get_mininet(arguments, topo, switch)
net.start()
diff --git a/trellis/trellislib.py b/trellis/trellislib.py
index d5e2d2b..f61b7f7 100644
--- a/trellis/trellislib.py
+++ b/trellis/trellislib.py
@@ -149,6 +149,8 @@
def config(self, **kwargs):
super(DhcpServer, self).config(**kwargs)
+ if "configFile" in kwargs:
+ self.configFile = kwargs['configFile']
self.cmd('touch %s' % self.leasesFile)
self.cmd('%s -q -4 -pf %s -cf %s %s' % (self.binFile, self.pidFile, self.configFile, self.defaultIntf()))