'Returns a list of association targets of instance VIFs.
Each association target is represented as FloatingIpTarget object.
FloatingIpTarget is a APIResourceWrapper/APIDictWrapper and
\'id\' and \'name\' attributes must be defined in each object.
FloatingIpTarget.id can be passed as port_id in associate().
FloatingIpTarget.name is displayed in Floating Ip Association Form.'

@profiler.trace
def list_targets(self):

    tenant_id = self.request.user.tenant_id
    ports = port_list(self.request, tenant_id=tenant_id)
    (servers, has_more) = nova.server_list(self.request, detailed=False)
    server_dict = collections.OrderedDict([(s.id, s.name) for s in servers])
    reachable_subnets = self._get_reachable_subnets(ports)
    targets = []
    for p in ports:
        if p.device_owner.startswith('network:'):
            continue
        server_name = server_dict.get(p.device_id)
        for ip in p.fixed_ips:
            if (ip['subnet_id'] not in reachable_subnets):
                continue
            targets.append(FloatingIpTarget(p, ip['ip_address'], server_name))
    return targets
