blob: 4dbbde0b234f48c57719e268a52cb8bd5fa60125 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package device
import (
"context"
"fmt"
"go.fuchsia.dev/fuchsia/tools/lib/logger"
)
type DeviceResolver interface {
// NodeNames returns a list of nodenames for a device.
NodeNames() []string
// Resolve the device's nodename into a hostname.
ResolveName(ctx context.Context) (string, error)
}
// ConstnatAddressResolver returns a fixed hostname for the specified nodename.
type ConstantHostResolver struct {
nodeNames []string
host string
}
// NewConstantAddressResolver constructs a fixed host.
func NewConstantHostResolver(ctx context.Context, nodeName string, host string) ConstantHostResolver {
nodeNames := []string{nodeName}
if oldNodeName, err := translateToOldNodeName(nodeName); err == nil {
logger.Infof(ctx, "translated device name %q to old nodename %q", nodeName, oldNodeName)
nodeNames = append(nodeNames, oldNodeName)
} else {
logger.Warningf(ctx, "could not translate %q into old device name: %v", nodeName, err)
}
return ConstantHostResolver{
nodeNames: nodeNames,
host: host,
}
}
func (r ConstantHostResolver) NodeNames() []string {
return r.nodeNames
}
func (r ConstantHostResolver) ResolveName(ctx context.Context) (string, error) {
return r.host, nil
}
// DeviceFinderResolver uses `device-finder` to resolve a nodename into a hostname.
// The logic here should match get-fuchsia-device-addr (//tools/devshell/lib/vars.sh).
type DeviceFinderResolver struct {
deviceFinder *DeviceFinder
nodeNames []string
}
// NewDeviceFinderResolver constructs a new `DeviceFinderResolver` for the specific
func NewDeviceFinderResolver(ctx context.Context, deviceFinder *DeviceFinder, nodeName string) (*DeviceFinderResolver, error) {
if nodeName == "" {
entries, err := deviceFinder.List(ctx, Mdns)
if err != nil {
return nil, fmt.Errorf("failed to list devices: %w", err)
}
if len(entries) == 0 {
return nil, fmt.Errorf("no devices found")
}
if len(entries) != 1 {
return nil, fmt.Errorf("cannot use empty nodename with multiple devices: %v", entries)
}
nodeName = entries[0].NodeName
}
nodeNames := []string{nodeName}
// FIXME(http://fxbug.dev/71146) we can switch back to the resolver
// resolving a single name after we no longer support testing builds
// older than 2021-02-22.
if oldNodeName, err := translateToOldNodeName(nodeName); err == nil {
logger.Infof(ctx, "translated device name %q to old nodename %q", nodeName, oldNodeName)
nodeNames = append(nodeNames, oldNodeName)
} else {
logger.Warningf(ctx, "could not translate %q into old device name: %v", nodeName, err)
}
return &DeviceFinderResolver{
deviceFinder: deviceFinder,
nodeNames: nodeNames,
}, nil
}
func (r *DeviceFinderResolver) NodeNames() []string {
return r.nodeNames
}
func (r *DeviceFinderResolver) ResolveName(ctx context.Context) (string, error) {
entry, err := r.deviceFinder.Resolve(ctx, Mdns, r.nodeNames)
if err != nil {
return "", err
}
return entry.Address, nil
}