Added a solar test topology.
diff --git a/tools/test/topos/sol.py b/tools/test/topos/sol.py
new file mode 100644
index 0000000..ef99a9c
--- /dev/null
+++ b/tools/test/topos/sol.py
@@ -0,0 +1,4 @@
+#!/usr/bin/python
+import sys, solar
+topo = solar.Solar(cip=sys.argv[1])
+topo.run()
diff --git a/tools/test/topos/solar.py b/tools/test/topos/solar.py
new file mode 100644
index 0000000..d8e83a1
--- /dev/null
+++ b/tools/test/topos/solar.py
@@ -0,0 +1,115 @@
+#!/usr/bin/env python
+from mininet.cli import CLI
+from mininet.net import Mininet
+from mininet.node import RemoteController, OVSKernelSwitch
+
+MAC = 12
+DPID = 16
+
+class CustomCLI(CLI):
+    """Custom CLI to allow us to add our own commands."""
+
+    def __init__ (self, net):
+        """Init method for our custom CLI."""
+        self.net = net
+        CLI.__init__(self, net)
+
+class Solar(object):
+    """ Create a tiered topology from semi-scratch in Mininet """
+
+    def __init__(self, cname='onos', cip='192.168.56.1', islands=3, edges=2, hosts=2,
+                 proto=None):
+        """Create tower topology for mininet"""
+
+        # We are creating the controller with local-loopback on purpose to avoid
+        # having the switches connect immediately. Instead, we'll set controller
+        # explicitly for each switch after configuring it as we want.
+        self.flare = RemoteController(cname, cip, 6633)
+        self.net = Mininet(controller=self.flare, switch = OVSKernelSwitch,
+                           build=False)
+
+        self.cip = cip
+        self.spines = []
+        self.leaves = []
+        self.hosts = []
+        self.proto = proto
+
+        # Create the two core switches and links between them
+        c1 = self.net.addSwitch('c1',dpid='1111000000000000')
+        c2 = self.net.addSwitch('c2',dpid='2222000000000000')
+        self.spines.append(c1)
+        self.spines.append(c2)
+
+        self.net.addLink(c1, c2)
+        self.net.addLink(c2, c1)
+
+        for i in range(1, islands + 1):
+            sc = self.createSpineClump(i, edges, hosts)
+            self.net.addLink(c1, sc[0])
+            self.net.addLink(c2, sc[0])
+            self.net.addLink(c1, sc[1])
+            self.net.addLink(c2, sc[1])
+
+    def createSpineClump(self, island, edges, hosts):
+        """ Creates a clump of spine and edge switches with hosts"""
+        s1 = self.net.addSwitch('s%1d1' % island,dpid='00000%1d0100000000' % island)
+        s2 = self.net.addSwitch('s%1d2' % island,dpid='00000%1d0200000000' % island)
+        self.net.addLink(s1, s2)
+        self.net.addLink(s2, s1)
+
+        for i in range(1, edges + 1):
+            es = self.createEdgeSwitch(island, i, hosts)
+            self.net.addLink(es, s1)
+            self.net.addLink(es, s2)
+
+        self.spines.append(s1)
+        self.spines.append(s2)
+
+        clump = []
+        clump.append(s1)
+        clump.append(s2)
+        return clump
+
+    def createEdgeSwitch(self, island, index, hosts):
+        """ Creates an edge switch in an island and ads hosts to it"""
+        sw = self.net.addSwitch('e%1d%1d' % (island, index),dpid='0000000%1d0000000%1d' % (island, index))
+        self.leaves.append(sw)
+
+        for j in range(1, hosts + 1):
+            host = self.net.addHost('h%d%d%d' % (island, index, j),ip='10.%d.%d.%d' % (island, index, j))
+            self.net.addLink(host, sw)
+            self.hosts.append(host)
+        return sw
+
+    def run(self):
+        """ Runs the created network topology and launches mininet cli"""
+        self.run_silent()
+        CustomCLI(self.net)
+        self.net.stop()
+
+    def run_silent(self):
+        """ Runs silently - for unit testing """
+        self.net.build()
+
+        # Start the switches, configure them with desired protocols and only
+        # then set the controller
+        for sw in self.spines:
+            sw.start([self.flare])
+            if self.proto:
+                sw.cmd('ovs-vsctl set bridge %(sw)s protocols=%(proto)s' % \
+                           { 'sw': sw.name, 'proto': self.proto})
+            sw.cmdPrint('ovs-vsctl set-controller %(sw)s tcp:%(ctl)s:6633' % \
+                            {'sw': sw.name, 'ctl': self.cip})
+
+        for sw in self.leaves:
+            sw.start([self.flare])
+            sw.cmdPrint('ovs-vsctl set-controller %(sw)s tcp:%(ctl)s:6633' % \
+                            {'sw': sw.name, 'ctl': self.cip})
+
+    def pingAll(self):
+        """ PingAll to create flows - for unit testing """
+        self.net.pingAll()
+
+    def stop(self):
+        "Stops the topology. You should call this after run_silent"
+        self.net.stop()