components/openstack/neutron/files/agent/solaris/net_lib.py
branchs11-update
changeset 3121 462024268450
parent 3028 5e73a3a3f66a
child 1944 56ac2df1785b
equal deleted inserted replaced
3120:ad554abcb0c5 3121:462024268450
    14 #    License for the specific language governing permissions and limitations
    14 #    License for the specific language governing permissions and limitations
    15 #    under the License.
    15 #    under the License.
    16 #
    16 #
    17 # @author: Girish Moodalbail, Oracle, Inc.
    17 # @author: Girish Moodalbail, Oracle, Inc.
    18 #
    18 #
       
    19 
       
    20 import netaddr
    19 
    21 
    20 from quantum.agent.linux import utils
    22 from quantum.agent.linux import utils
    21 
    23 
    22 
    24 
    23 class CommandBase(object):
    25 class CommandBase(object):
    70                 result[atype] = []
    72                 result[atype] = []
    71                 val = result.get(atype)
    73                 val = result.get(atype)
    72             val.append(addr)
    74             val.append(addr)
    73         return result
    75         return result
    74 
    76 
    75     #TODO(gmoodalb): - might not work for IPv6
    77     def create_address(self, ipaddr, addrobjname=None, temp=True):
    76     def create_address(self, ipaddr, addrobjname=None,
       
    77                        addrtype='static', temp=True):
       
    78 
       
    79         if not self.ifname_exists(self._ifname):
    78         if not self.ifname_exists(self._ifname):
    80             # create ip interface
    79             # create ip interface
    81             cmd = ['/usr/sbin/ipadm', 'create-ip', self._ifname]
    80             cmd = ['/usr/sbin/ipadm', 'create-ip', self._ifname]
    82             if temp:
    81             if temp:
    83                 cmd.append('-t')
    82                 cmd.append('-t')
    84             self.execute_with_pfexec(cmd)
    83             self.execute_with_pfexec(cmd)
    85 
    84 
    86         if self.ipaddr_exists(self._ifname, ipaddr):
    85         if self.ipaddr_exists(self._ifname, ipaddr):
    87             return
    86             return
    88 
    87 
    89         cmd = ['/usr/sbin/ipadm', 'create-addr', '-T', addrtype, '-a',
    88         # If an address is IPv6, then to create a static IPv6 address
       
    89         # we need to create link-local address first
       
    90         if netaddr.IPNetwork(ipaddr).version == 6:
       
    91             # check if link-local address already exists
       
    92             cmd = ['/usr/sbin/dladm', 'show-linkprop', '-co', 'value',
       
    93                    '-p', 'mac-address', self._ifname]
       
    94             stdout = self.execute(cmd)
       
    95             mac_addr = stdout.splitlines()[0].strip()
       
    96             ll_addr = netaddr.EUI(mac_addr).ipv6_link_local()
       
    97 
       
    98             if not self.ipaddr_exists(self._ifname, str(ll_addr)):
       
    99                 # create a link-local address
       
   100                 cmd = ['/usr/sbin/ipadm', 'create-addr', '-T', 'static', '-a',
       
   101                        str(ll_addr), self._ifname]
       
   102                 if temp:
       
   103                     cmd.append('-t')
       
   104                 self.execute_with_pfexec(cmd)
       
   105 
       
   106         cmd = ['/usr/sbin/ipadm', 'create-addr', '-T', 'static', '-a',
    90                ipaddr, self._ifname]
   107                ipaddr, self._ifname]
    91         if temp:
   108         if temp:
    92             cmd.append('-t')
   109             cmd.append('-t')
    93 
   110 
    94         return self.execute_with_pfexec(cmd)
   111         return self.execute_with_pfexec(cmd)
   107             aobj = aobj_addr.split(':')[0]
   124             aobj = aobj_addr.split(':')[0]
   108             cmd = ['/usr/sbin/ipadm', 'delete-addr', aobj]
   125             cmd = ['/usr/sbin/ipadm', 'delete-addr', aobj]
   109             self.execute_with_pfexec(cmd)
   126             self.execute_with_pfexec(cmd)
   110             break
   127             break
   111 
   128 
   112         if len(aobj_addrs) == 1:
   129         isV6 = netaddr.IPNetwork(ipaddr).version == 6
       
   130         if len(aobj_addrs) == 1 or (isV6 and len(aobj_addrs) == 2):
   113             # delete the interface as well
   131             # delete the interface as well
   114             # TODO(gmoodalb): might not work for ipv6
       
   115             cmd = ['/usr/sbin/ipadm', 'delete-ip', self._ifname]
   132             cmd = ['/usr/sbin/ipadm', 'delete-ip', self._ifname]
   116             self.execute_with_pfexec(cmd)
   133             self.execute_with_pfexec(cmd)
   117 
   134 
   118     def delete_ip(self):
   135     def delete_ip(self):
   119         if not self.ifname_exists(self._ifname):
   136         if not self.ifname_exists(self._ifname):