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()))