blob: 81a814d8fdeb6b1cc7418fc29ca9a8654bebda0f [file]
// Copyright 2025 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 ffxutil
import (
"context"
"encoding/json"
"fmt"
"strconv"
)
// Output for `repository server list`.
type RepoServersList struct {
Ok struct {
Data []struct {
Name string `json:"name"`
} `json:"data"`
} `json:"ok"`
}
// StartPackageServer starts a package repository server at the given repoDir.
func (f *FFXInstance) StartPackageServer(ctx context.Context, name, address, repoDir string, port int) error {
if f.target == "" {
return fmt.Errorf("no target is set")
}
args := []string{"repository", "server", "start", "--foreground", "--address", fmt.Sprintf("%s:%d", address, port),
"--repository", name, "--repo-path", repoDir,
"--trusted-root", fmt.Sprintf("%s/repository/9.root.json", repoDir),
"--alias", "fuchsia.com", "--alias", "chromium.org",
"--no-device",
}
return f.invoker(args).setTimeout(0).setTarget(f.target).setMachineFormat(MachineRaw).run(ctx)
}
// StopPackageServer stops the package repository server with the given name.
func (f *FFXInstance) StopPackageServer(ctx context.Context, name string, port int) error {
if f.target == "" {
return fmt.Errorf("no target is set")
}
return f.invoker([]string{"repository", "server", "stop", name, "--port", strconv.Itoa(port)}).setTarget(f.target).run(ctx)
}
// ListPackageServer lists the running package servers.
func (f *FFXInstance) ListPackageServer(ctx context.Context) ([]string, error) {
if f.target == "" {
return nil, fmt.Errorf("no target is set")
}
i := f.invoker([]string{"repository", "server", "list"}).setTarget(f.target).setCaptureOutput()
err := i.run(ctx)
var result RepoServersList
if err := json.Unmarshal(i.output.Bytes(), &result); err != nil {
return nil, err
}
servers := []string{}
for _, server := range result.Ok.Data {
servers = append(servers, server.Name)
}
return servers, err
}
// Forward forwards connections between the host and the target.
func (f *FFXInstance) Forward(ctx context.Context, port int) error {
if f.target == "" {
return fmt.Errorf("no target is set")
}
return f.invoker([]string{"forward", fmt.Sprintf("%d<=0", port)}).setTarget(f.target).setTimeout(0).run(ctx)
}
// RegisterRepository registers the given package repository server with the target.
func (f *FFXInstance) RegisterRepository(ctx context.Context, repoName string, port int, overrideAddr string) error {
if f.target == "" {
return fmt.Errorf("no target is set")
}
args := []string{"target", "repository", "register", "--repository", repoName, "--port", strconv.Itoa(port),
"--alias", "fuchsia.com", "--alias", "chromium.org",
"--alias-conflict-mode", "replace"}
if overrideAddr != "" {
args = append(args, "--address-override", overrideAddr)
}
return f.invoker(args).setTarget(f.target).run(ctx)
}