components/openstack/neutron/files/agent/solaris/net_lib.py
branchs11-update
changeset 3121 462024268450
parent 3028 5e73a3a3f66a
child 1944 56ac2df1785b
--- a/components/openstack/neutron/files/agent/solaris/net_lib.py	Mon May 05 23:01:08 2014 -0700
+++ b/components/openstack/neutron/files/agent/solaris/net_lib.py	Tue May 06 10:16:09 2014 -0700
@@ -17,6 +17,8 @@
 # @author: Girish Moodalbail, Oracle, Inc.
 #
 
+import netaddr
+
 from quantum.agent.linux import utils
 
 
@@ -72,10 +74,7 @@
             val.append(addr)
         return result
 
-    #TODO(gmoodalb): - might not work for IPv6
-    def create_address(self, ipaddr, addrobjname=None,
-                       addrtype='static', temp=True):
-
+    def create_address(self, ipaddr, addrobjname=None, temp=True):
         if not self.ifname_exists(self._ifname):
             # create ip interface
             cmd = ['/usr/sbin/ipadm', 'create-ip', self._ifname]
@@ -86,7 +85,25 @@
         if self.ipaddr_exists(self._ifname, ipaddr):
             return
 
-        cmd = ['/usr/sbin/ipadm', 'create-addr', '-T', addrtype, '-a',
+        # If an address is IPv6, then to create a static IPv6 address
+        # we need to create link-local address first
+        if netaddr.IPNetwork(ipaddr).version == 6:
+            # check if link-local address already exists
+            cmd = ['/usr/sbin/dladm', 'show-linkprop', '-co', 'value',
+                   '-p', 'mac-address', self._ifname]
+            stdout = self.execute(cmd)
+            mac_addr = stdout.splitlines()[0].strip()
+            ll_addr = netaddr.EUI(mac_addr).ipv6_link_local()
+
+            if not self.ipaddr_exists(self._ifname, str(ll_addr)):
+                # create a link-local address
+                cmd = ['/usr/sbin/ipadm', 'create-addr', '-T', 'static', '-a',
+                       str(ll_addr), self._ifname]
+                if temp:
+                    cmd.append('-t')
+                self.execute_with_pfexec(cmd)
+
+        cmd = ['/usr/sbin/ipadm', 'create-addr', '-T', 'static', '-a',
                ipaddr, self._ifname]
         if temp:
             cmd.append('-t')
@@ -109,9 +126,9 @@
             self.execute_with_pfexec(cmd)
             break
 
-        if len(aobj_addrs) == 1:
+        isV6 = netaddr.IPNetwork(ipaddr).version == 6
+        if len(aobj_addrs) == 1 or (isV6 and len(aobj_addrs) == 2):
             # delete the interface as well
-            # TODO(gmoodalb): might not work for ipv6
             cmd = ['/usr/sbin/ipadm', 'delete-ip', self._ifname]
             self.execute_with_pfexec(cmd)