Add DHCPv6Client and DHCPv6Server

Change-Id: I08db355f5632c14fdfcda3f252b0b77daadae500
diff --git a/trellis/dhcpd6.conf b/trellis/dhcpd6.conf
new file mode 100644
index 0000000..a8d20ff
--- /dev/null
+++ b/trellis/dhcpd6.conf
@@ -0,0 +1,37 @@
+default-lease-time 600;
+max-lease-time 7200;
+
+option dhcp6.next-hop code 242 = ip6-address;
+
+subnet6 2000::200/120 {
+  range6 2000::260 2000::02fe;
+  option dhcp6.next-hop 2000::02ff;
+}
+
+subnet6 2000::300/120 {
+  range6 2000::360 2000::3fe;
+  option dhcp6.next-hop 2000::03ff;
+}
+
+subnet6 2000::9903/128 {
+}
+
+host h1v6 {
+  hardware ethernet 00:bb:00:00:00:01;
+  fixed-address6 2000::201;
+}
+
+host h2v6 {
+  hardware ethernet 00:bb:00:00:00:02;
+  fixed-address6 2000::202;
+}
+
+host h3v6 {
+  hardware ethernet 00:bb:00:00:00:03;
+  fixed-address6 2000::301;
+}
+
+host h4v6 {
+  hardware ethernet 00:bb:00:00:00:04;
+  fixed-address6 2000::302;
+}
diff --git a/trellis/trellislib.py b/trellis/trellislib.py
index 6bff4cc..db0fb65 100644
--- a/trellis/trellislib.py
+++ b/trellis/trellislib.py
@@ -49,6 +49,21 @@
         self.cmd('rm -rf %s' % self.pidFile)
         super(DhcpClient, self).terminate()
 
+class Dhcp6Client(Host):
+    def __init__(self, name, *args, **kwargs):
+        super(Dhcp6Client, self).__init__(name, **kwargs)
+        self.pidFile = '/run/dhclient-%s.pid' % self.name
+
+    def config(self, **kwargs):
+        super(Dhcp6Client, self).config(**kwargs)
+        self.cmd('ip addr flush dev %s' % self.defaultIntf())
+        self.cmd('dhclient -q -6 -nw -pf %s %s' % (self.pidFile, self.defaultIntf()))
+
+    def terminate(self, **kwargs):
+        self.cmd('kill -9 `cat %s`' % self.pidFile)
+        self.cmd('rm -rf %s' % self.pidFile)
+        super(Dhcp6Client, self).terminate()
+
 class DhcpServer(RoutedHost):
     binFile = '/usr/sbin/dhcpd'
     pidFile = '/run/dhcp-server/dhcpd.pid'
@@ -63,6 +78,23 @@
         self.cmd('rm -rf %s' % self.pidFile)
         super(DhcpServer, self).terminate()
 
+class Dhcp6Server(RoutedHost):
+    binFile = '/usr/sbin/dhcpd'
+    pidFile = '/run/dhcp-server/dhcpd6.pid'
+    configFile = './dhcpd6.conf'
+    leasesFile = '/var/lib/dhcp/dhcpd6.leases'
+
+    def config(self, **kwargs):
+        super(Dhcp6Server, self).config(**kwargs)
+        self.cmd('touch %s' % self.leasesFile)
+        self.cmd('%s -q -6 -pf %s -cf %s %s' % (self.binFile, self.pidFile, self.configFile, self.defaultIntf()))
+
+    def terminate(self, **kwargs):
+        self.cmd('kill -9 `cat %s`' % self.pidFile)
+        self.cmd('rm -rf %s' % self.pidFile)
+        self.cmd('rm -rf  %s' % self.leasesFile)
+        super(DhcpServer, self).terminate()
+
 class TaggedDhcpClient(Host):
     def __init__(self, name, vlan, *args, **kwargs):
         super(TaggedDhcpClient, self).__init__(name, **kwargs)