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