README
¶
tmpnet - temporary network orchestration
This package implements a simple orchestrator for the avalanchego
nodes of a temporary network. Configuration is stored on disk, and
nodes run as independent processes whose process details are also
written to disk. Using the filesystem to store configuration and
process details allows for the tmpnetctl
cli and e2e test fixture to
orchestrate the same temporary networks without the use of an rpc daemon.
What's in a name?
The name of this package was originally testnet
and its cli was
testnetctl
. This name was chosen in ignorance that testnet
commonly refers to a persistent blockchain network used for testing.
To avoid confusion, the name was changed to tmpnet
and its cli
tmpnetctl
. tmpnet
is short for temporary network
since the
networks it deploys are likely to live for a limited duration in
support of the development and testing of avalanchego and its related
repositories.
Package details
The functionality in this package is grouped by logical purpose into the following non-test files:
Filename | Types | Purpose |
---|---|---|
defaults.go | Defines common default configuration | |
flags.go | FlagsMap | Simplifies configuration of avalanchego flags |
genesis.go | Creates test genesis | |
network.go | Network | Orchestrates and configures temporary networks |
network_config.go | Network | Reads and writes network configuration |
node.go | Node | Orchestrates and configures nodes |
node_config.go | Node | Reads and writes node configuration |
node_process.go | NodeProcess | Orchestrates node processes |
subnet.go | Subnet | Orchestrates subnets |
utils.go | Defines shared utility functions |
Usage
Via tmpnetctl
A temporary network can be managed by the tmpnetctl
cli tool:
# From the root of the avalanchego repo
# Start a new network. Possible to specify the number of nodes (> 1) with --node-count.
$ ./bin/tmpnetctl start-network --avalanchego-path=/path/to/avalanchego
...
Started network /home/me/.tmpnet/networks/20240306-152305.924531 (UUID: abaab590-b375-44f6-9ca5-f8a6dc061725)
Configure tmpnetctl to target this network by default with one of the following statements:
- source /home/me/.tmpnet/networks/20240306-152305.924531/network.env
- export TMPNET_NETWORK_DIR=/home/me/.tmpnet/networks/20240306-152305.924531
- export TMPNET_NETWORK_DIR=/home/me/.tmpnet/networks/latest
# Stop the network
$ ./bin/tmpnetctl stop-network --network-dir=/path/to/network
Note the export of the path ending in latest
. This is a symlink that
is set to the last network created by tmpnetctl start-network
. Setting
the TMPNET_NETWORK_DIR
env var to this symlink ensures that
tmpnetctl
commands target the most recently deployed temporary
network.
Simplifying usage with direnv
The repo includes a .envrc that can be applied by
direnv when in a shell. This will enable
tmpnetctl
to be invoked directly (without a ./bin/
prefix ) and
without having to specify the --avalanchego-path
or --plugin-dir
flags.
Deprecated usage with e2e suite
tmpnetctl
was previously used to create temporary networks for use
across multiple e2e test runs. As the usage of temporary networks has
expanded to require subnets, that usage has been supplanted by the
--reuse-network
flag defined for the e2e suite. It was easier to
support defining subnet configuration in the e2e suite in code than to
extend a cli tool like tmpnetctl
to support similar capabilities.
Via code
A temporary network can be managed in code:
network := &tmpnet.Network{ // Configure non-default values for the new network
DefaultFlags: tmpnet.FlagsMap{
config.LogLevelKey: "INFO", // Change one of the network's defaults
},
Nodes: tmpnet.NewNodesOrPanic(5), // Number of initial validating nodes
Subnets: []*tmpnet.Subnet{ // Subnets to create on the new network once it is running
{
Name: "xsvm-a", // User-defined name used to reference subnet in code and on disk
Chains: []*tmpnet.Chain{
{
VMName: "xsvm", // Name of the VM the chain will run, will be used to derive the name of the VM binary
Genesis: <genesis bytes>, // Genesis bytes used to initialize the custom chain
PreFundedKey: <key>, // (Optional) A private key that is funded in the genesis bytes
VersionArgs: "version-json", // (Optional) Arguments that prompt the VM binary to output version details in json format.
// If one or more arguments are provided, the resulting json output should include a field
// named `rpcchainvm` of type uint64 containing the rpc version supported by the VM binary.
// The version will be checked against the version reported by the configured avalanchego
// binary before network and node start.
},
},
ValidatorIDs: <node ids>, // The IDs of nodes that validate the subnet
},
},
}
_ := tmpnet.BootstrapNewNetwork( // Bootstrap the network
ctx, // Context used to limit duration of waiting for network health
ginkgo.GinkgoWriter, // Writer to report progress of initialization
network,
"", // Empty string uses the default network path (~/tmpnet/networks)
"/path/to/avalanchego", // The path to the binary that nodes will execute
"/path/to/plugins", // The path nodes will use for plugin binaries (suggested value ~/.avalanchego/plugins)
)
uris := network.GetNodeURIs()
// Use URIs to interact with the network
// Stop all nodes in the network
network.Stop(context.Background())
Networking configuration
By default, nodes in a temporary network will be started with staking and
API ports set to 0
to ensure that ports will be dynamically
chosen. The tmpnet fixture discovers the ports used by a given node
by reading the [base-data-dir]/process.json
file written by
avalanchego on node start. The use of dynamic ports supports testing
with many temporary networks without having to manually select compatible
port ranges.
Configuration on disk
A temporary network relies on configuration written to disk in the following structure:
HOME
└── .tmpnet // Root path for the temporary network fixture
├── prometheus // Working directory for a metrics-scraping prometheus instance
│ └── file_sd_configs // Directory containing file-based service discovery config for prometheus
├── promtail // Working directory for a log-collecting promtail instance
│ └── file_sd_configs // Directory containing file-based service discovery config for promtail
└── networks // Default parent directory for temporary networks
└── 20240306-152305.924531 // The timestamp of creation is the name of a network's directory
├── NodeID-37E8UK3x2YFsHE3RdALmfWcppcZ1eTuj9 // The ID of a node is the name of its data dir
│ ├── chainData
│ │ └── ...
│ ├── config.json // Node runtime configuration
│ ├── db
│ │ └── ...
│ ├── flags.json // Node flags
│ ├── logs
│ │ └── ...
│ ├── plugins
│ │ └── ...
│ └── process.json // Node process details (PID, API URI, staking address)
├── chains
│ ├── C
│ │ └── config.json // C-Chain config for all nodes
│ └── raZ51bwfepaSaZ1MNSRNYNs3ZPfj...U7pa3
│ └── config.json // Custom chain configuration for all nodes
├── config.json // Common configuration (including defaults and pre-funded keys)
├── genesis.json // Genesis for all nodes
├── metrics.txt // Link for metrics and logs collected from the network (see: Monitoring)
├── network.env // Sets network dir env var to simplify network usage
└── subnets // Directory containing subnet config for both avalanchego and tmpnet
├── subnet-a.json // tmpnet configuration for subnet-a and its chain(s)
├── subnet-b.json // tmpnet configuration for subnet-b and its chain(s)
└── 2jRbWtaonb2RP8DEM5DBsd7o2o8d...RqNs9 // The ID of a subnet is the name of its configuration dir
└── config.json // avalanchego configuration for subnet
Common networking configuration
Network configuration such as default flags (e.g. --log-level=
),
runtime defaults (e.g. avalanchego path) and pre-funded private keys
are stored at [network-dir]/config.json
. A given default will only
be applied to a new node on its addition to the network if the node
does not explicitly set a given value.
Genesis
The genesis file is stored at [network-dir]/genesis.json
and
referenced by default by all nodes in the network. The genesis file
content will be generated with reasonable defaults if not
supplied. Each node in the network can override the default by setting
an explicit value for --genesis-file
or --genesis-file-content
.
Chain configuration
The chain configuration for a temporary network is stored at
[network-dir]/chains/[chain alias or ID]/config.json
and referenced
by all nodes in the network. The C-Chain config will be generated with
reasonable defaults if not supplied. X-Chain and P-Chain will use
implicit defaults. The configuration for custom chains can be provided
with subnet configuration and will be written to the appropriate path.
Each node in the network can override network-level chain
configuration by setting --chain-config-dir
to an explicit value and
ensuring that configuration files for all chains exist at
[custom-chain-config-dir]/[chain alias or ID]/config.json
.
Network env
A shell script that sets the TMPNET_NETWORK_DIR
env var to the
path of the network is stored at [network-dir]/network.env
. Sourcing
this file (i.e. source network.env
) in a shell will configure ginkgo
e2e and the tmpnetctl
cli to target the network path specified in
the env var.
Set TMPNET_ROOT_DIR
to specify the root directory in which to create
the configuration directory of new networks
(e.g. $TMPNET_ROOT_DIR/[network-dir]
). The default root directory is
~/.tmpdir/networks
. Configuring the root directory is only relevant
when creating new networks as the path of existing networks will
already have been set.
Node configuration
The data dir for a node is set by default to
[network-path]/[node-id]
. A node can be configured to use a
non-default path by explicitly setting the --data-dir
flag.
Runtime config
The details required to configure a node's execution are written to
[network-path]/[node-id]/config.json
. This file contains the
runtime-specific details like the path of the avalanchego binary to
start the node with.
Flags
All flags used to configure a node are written to
[network-path]/[node-id]/flags.json
so that a node can be
configured with only a single argument:
--config-file=/path/to/flags.json
. This simplifies node launch and
ensures all parameters used to launch a node can be modified by
editing the config file.
Process details
The process details of a node are written by avalanchego to
[base-data-dir]/process.json
. The file contains the PID of the node
process, the URI of the node's API, and the address other nodes can
use to bootstrap themselves (aka staking address).
Monitoring
Monitoring is an essential part of understanding the workings of a distributed system such as avalanchego. The tmpnet fixture enables collection of logs and metrics from temporary networks to a monitoring stack (prometheus+loki+grafana) to enable results to be analyzed and shared.
Example usage
# Start prometheus to collect metrics
PROMETHEUS_USERNAME=<username> PROMETHEUS_PASSWORD=<password> ./scripts/run_prometheus.sh
# Start promtail to collect logs
LOKI_USERNAME=<username> LOKI_PASSWORD=<password> ./scripts/run_promtail.sh
# Network start emits link to grafana displaying collected logs and metrics
./bin/tmpnetctl start-network
# Configure metrics collection from a local node binding to the default API
# port of 9650 and storing its logs in ~/.avalanchego/logs. The script will
# also emit a link to grafana.
./scripts/configure-local-metrics-collection.sh
Metrics collection
When a node is started, configuration enabling collection of metrics
from the node is written to
~/.tmpnet/prometheus/file_sd_configs/[network uuid]-[node id].json
.
The scripts/run_prometheus.sh
script starts prometheus in agent mode
configured to scrape metrics from configured nodes and forward the
metrics to a persistent prometheus instance. The script requires that
the PROMETHEUS_USERNAME
and PROMETHEUS_PASSWORD
env vars be set. By
default the prometheus instance at
https://prometheus-poc.avax-dev.network will be targeted and
this can be overridden via the PROMETHEUS_URL
env var.
Log collection
Nodes log are stored at ~/.tmpnet/networks/[network id]/[node id]/logs
by default, and can optionally be forwarded to loki with
promtail.
When a node is started, promtail configuration enabling
collection of logs for the node is written to
~/.tmpnet/promtail/file_sd_configs/[network uuid]-[node id].json
.
The scripts/run_promtail.sh
script starts promtail configured to
collect logs from configured nodes and forward the results to loki. The
script requires that the LOKI_USERNAME
and LOKI_PASSWORD
env vars be
set. By default the loki instance at
https://loki-poc.avax-dev.network will be targeted and this
can be overridden via the LOKI_URL
env var.
Labels
The logs and metrics collected for temporary networks will have the following labels applied:
network_uuid
- uniquely identifies a network across hosts
node_id
is_ephemeral_node
- 'ephemeral' nodes are expected to run for only a fraction of the life of a network
network_owner
- an arbitrary string that can be used to differentiate results when a CI job runs more than one network
When a network runs as part of a github CI job, the following additional labels will be applied:
gh_repo
gh_workflow
gh_run_id
gh_run_number
gh_run_attempt
gh_job_id
These labels are sourced from Github Actions' github
context as per
https://docs.github.com/en/actions/learn-github-actions/contexts#github-context.
Viewing
Local networks
When a network is started with tmpnet, a link to the default grafana instance will be emitted. The dashboards will only be populated if prometheus and promtail are running locally (as per previous sections) to collect metrics and logs.
CI
Collection of logs and metrics is enabled for CI jobs that use
tmpnet. Each job will execute a step titled Notify of metrics availability
that emits a link to grafana parametized to show results
for the job. Additional links to grafana parametized to show results
for individual network will appear in the logs displaying the start of
those networks.
Documentation
¶
Index ¶
- Constants
- Variables
- func BootstrapNewNetwork(ctx context.Context, log logging.Logger, network *Network, ...) error
- func CheckNodeHealth(ctx context.Context, uri string) (*health.APIReply, error)
- func DefaultChainConfigs() map[string]FlagsMap
- func DefaultJSONMarshal(v interface{}) ([]byte, error)
- func DefaultPodFlags(networkName string, dataDir string) map[string]string
- func GetReusableNetworkPathForOwner(owner string) (string, error)
- func MetricsLinkForNetwork(networkUUID string, startTime string, endTime string) string
- func NewNodeStatefulSet(name string, imageName string, containerName string, volumeName string, ...) *appsv1.StatefulSet
- func NewPrivateKeys(keyCount int) ([]*secp256k1.PrivateKey, error)
- func NewTestGenesis(networkID uint32, nodes []*Node, keysToFund []*secp256k1.PrivateKey) (*genesis.UnparsedConfig, error)
- func NodesToIDs(nodes ...*Node) []ids.NodeID
- func RestartNetwork(ctx context.Context, log logging.Logger, dir string) error
- func StopNetwork(ctx context.Context, dir string) error
- func WaitForActiveValidators(ctx context.Context, log logging.Logger, pChainClient platformvm.Client, ...) error
- func WaitForHealthy(ctx context.Context, node *Node) error
- func WaitForNodeHealthy(ctx context.Context, log logging.Logger, kubeconfig *restclient.Config, ...) (ids.NodeID, error)
- func WaitForPodCondition(ctx context.Context, clientset *kubernetes.Clientset, namespace string, ...) error
- func WaitForPodStatus(ctx context.Context, clientset *kubernetes.Clientset, namespace string, ...) error
- type Chain
- type FlagsMap
- type Network
- func (n *Network) Bootstrap(ctx context.Context, log logging.Logger) error
- func (n *Network) Create(rootDir string) error
- func (n *Network) CreateSubnets(ctx context.Context, log logging.Logger, apiURI string, restartRequired bool) error
- func (n *Network) DefaultGenesis() (*genesis.UnparsedConfig, error)
- func (n *Network) EnsureDefaultConfig(log logging.Logger, avalancheGoPath string, pluginDir string) error
- func (n *Network) EnsureNodeConfig(node *Node) error
- func (n *Network) EnvFileContents() string
- func (n *Network) EnvFilePath() string
- func (n *Network) GetChainConfigDir() string
- func (n *Network) GetNetworkID() uint32
- func (n *Network) GetNodeURIs() []NodeURI
- func (n *Network) GetSubnet(name string) *Subnet
- func (n *Network) GetSubnetDir() string
- func (n *Network) GetURIForNodeID(nodeID ids.NodeID) (string, error)
- func (n *Network) Read() error
- func (n *Network) Restart(ctx context.Context, log logging.Logger) error
- func (n *Network) RestartNode(ctx context.Context, log logging.Logger, node *Node) error
- func (n *Network) StartNode(ctx context.Context, log logging.Logger, node *Node) error
- func (n *Network) StartNodes(ctx context.Context, log logging.Logger, nodesToStart ...*Node) error
- func (n *Network) Stop(ctx context.Context) error
- func (n *Network) TrackedSubnetsForNode(nodeID ids.NodeID) string
- func (n *Network) Write() error
- type Node
- func (n *Node) EnsureBLSSigningKey() error
- func (n *Node) EnsureKeys() error
- func (n *Node) EnsureNodeID() error
- func (n *Node) EnsureStakingKeypair() error
- func (n *Node) GetDataDir() string
- func (n *Node) GetProofOfPossession() (*signer.ProofOfPossession, error)
- func (n *Node) GetUniqueID() string
- func (n *Node) InitiateStop(ctx context.Context) error
- func (n *Node) IsHealthy(ctx context.Context) (bool, error)
- func (n *Node) Read() error
- func (n *Node) SaveMetricsSnapshot(ctx context.Context) error
- func (n *Node) SetNetworkingConfig(bootstrapIDs []string, bootstrapIPs []string)
- func (n *Node) Start(log logging.Logger) error
- func (n *Node) Stop(ctx context.Context) error
- func (n *Node) WaitForStopped(ctx context.Context) error
- func (n *Node) Write() error
- type NodeProcess
- type NodeRuntime
- type NodeRuntimeConfig
- type NodeURI
- type RPCChainVMVersion
- type Subnet
- func (s *Subnet) AddValidators(ctx context.Context, log logging.Logger, apiURI string, nodes ...*Node) error
- func (s *Subnet) Create(ctx context.Context, uri string) error
- func (s *Subnet) CreateChains(ctx context.Context, log logging.Logger, uri string) error
- func (s *Subnet) GetWallet(ctx context.Context, uri string) (*primary.Wallet, error)
- func (s *Subnet) HasChainConfig() bool
- func (s *Subnet) Write(subnetDir string, chainDir string) error
- type XChainBalanceMap
Constants ¶
const ( // Interval appropriate for network operations that should be // retried periodically but not too often. DefaultPollingInterval = 500 * time.Millisecond // Validator start time must be a minimum of SyncBound from the // current time for validator addition to succeed, and adding 20 // seconds provides a buffer in case of any delay in processing. DefaultValidatorStartTimeDiff = executor.SyncBound + 20*time.Second DefaultNetworkTimeout = 2 * time.Minute // Minimum required to ensure connectivity-based health checks will pass DefaultNodeCount = 2 // Arbitrary number of pre-funded keys to create by default DefaultPreFundedKeyCount = 50 // A short minimum stake duration enables testing of staking logic. DefaultMinStakeDuration = time.Second )
const ( // Constants defining the names of shell variables whose value can // configure network orchestration. NetworkDirEnvName = "TMPNET_NETWORK_DIR" RootDirEnvName = "TMPNET_ROOT_DIR" // Message to log indicating where to look for metrics and logs for network MetricsAvailableMessage = "metrics and logs available via grafana (collectors must be running)" // eth address: 0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC HardHatKeyStr = "56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027" )
const (
AvalancheGoPathEnvName = "AVALANCHEGO_PATH"
)
const (
DefaultNodeTickerInterval = 50 * time.Millisecond
)
Variables ¶
var (
AvalancheGoPluginDirEnvName = config.EnvVarName(config.EnvPrefix, config.PluginDirKey)
)
var ErrUnrecoverableNodeHealthCheck = errors.New("failed to query node health")
var ( // Key expected to be funded for subnet-evm hardhat testing // TODO(marun) Remove when subnet-evm configures the genesis with this key. HardhatKey *secp256k1.PrivateKey )
Functions ¶
func BootstrapNewNetwork ¶ added in v1.11.7
func CheckNodeHealth ¶ added in v1.11.12
func DefaultChainConfigs ¶ added in v1.10.18
A set of chain configurations appropriate for testing.
func DefaultJSONMarshal ¶
Marshal to json with default prefix and indent.
func DefaultPodFlags ¶ added in v1.11.13
DefaultPodFlags defines common flags for avalanchego nodes running in a pod.
func GetReusableNetworkPathForOwner ¶ added in v1.11.5
Retrieves the path to a reusable network path for the given owner.
func MetricsLinkForNetwork ¶ added in v1.11.12
MetricsLinkForNetwork returns a link to the default metrics dashboard for the network with the given UUID. The start and end times are accepted as strings to support the use of Grafana's time range syntax (e.g. `now`, `now-1h`).
func NewNodeStatefulSet ¶ added in v1.11.13
func NewNodeStatefulSet( name string, imageName string, containerName string, volumeName string, volumeSize string, volumeMountPath string, flags map[string]string, ) *appsv1.StatefulSet
newNodeStatefulSet returns a statefulset for an avalanchego node.
func NewPrivateKeys ¶ added in v1.10.18
func NewPrivateKeys(keyCount int) ([]*secp256k1.PrivateKey, error)
Helper simplifying creation of a set of private keys
func NewTestGenesis ¶
func NewTestGenesis( networkID uint32, nodes []*Node, keysToFund []*secp256k1.PrivateKey, ) (*genesis.UnparsedConfig, error)
Create a genesis struct valid for bootstrapping a test network. Note that many of the genesis fields (e.g. reward addresses) are randomly generated or hard-coded.
func NodesToIDs ¶ added in v1.11.4
func RestartNetwork ¶ added in v1.10.18
Restarts the nodes of the network configured in the provided directory.
func StopNetwork ¶ added in v1.10.18
Stops the nodes of the network configured in the provided directory.
func WaitForActiveValidators ¶ added in v1.11.10
func WaitForHealthy ¶
WaitForHealthy blocks until Node.IsHealthy returns true or an error (including context timeout) is observed.
func WaitForNodeHealthy ¶ added in v1.11.13
func WaitForNodeHealthy( ctx context.Context, log logging.Logger, kubeconfig *restclient.Config, namespace string, podName string, healthCheckInterval time.Duration, out io.Writer, outErr io.Writer, ) (ids.NodeID, error)
WaitForNodeHealthy waits for the node running in the specified pod to report healthy.
func WaitForPodCondition ¶ added in v1.11.13
func WaitForPodCondition(ctx context.Context, clientset *kubernetes.Clientset, namespace string, podName string, conditionType corev1.PodConditionType) error
WaitForPodCondition watches the specified pod until the status includes the specified condition.
func WaitForPodStatus ¶ added in v1.11.13
func WaitForPodStatus( ctx context.Context, clientset *kubernetes.Clientset, namespace string, name string, acceptable func(*corev1.PodStatus) bool, ) error
WaitForPodStatus watches the specified pod until the status is deemed acceptable by the provided test function.
Types ¶
type Chain ¶ added in v1.10.18
type Chain struct { // Set statically VMID ids.ID Config string Genesis []byte // VersionArgs are the argument(s) to pass to the VM binary to receive // version details in json format (e.g. `--version-json`). This // supports checking that the rpcchainvm version of the VM binary // matches the version used by the configured avalanchego binary. If // empty, the version check will be skipped. VersionArgs []string // Set at runtime ChainID ids.ID PreFundedKey *secp256k1.PrivateKey }
func (*Chain) WriteConfig ¶ added in v1.10.18
Write the chain configuration to the specified directory.
type FlagsMap ¶
type FlagsMap map[string]interface{}
Defines a mapping of flag keys to values intended to be supplied to an invocation of an AvalancheGo node.
func DefaultTestFlags ¶ added in v1.11.6
func DefaultTestFlags() FlagsMap
Flags appropriate for networks used for all types of testing.
func DefaultTmpnetFlags ¶ added in v1.11.6
func DefaultTmpnetFlags() FlagsMap
Flags appropriate for tmpnet networks.
func ReadFlagsMap ¶
Utility function simplifying construction of a FlagsMap from a file.
func (FlagsMap) GetBoolVal ¶ added in v1.11.7
GetBoolVal simplifies retrieving a map value as a bool.
func (FlagsMap) GetStringVal ¶
GetStringVal simplifies retrieving a map value as a string.
func (FlagsMap) SetDefaults ¶
SetDefaults ensures the effectiveness of flag overrides by only setting values supplied in the defaults map that are not already explicitly set.
type Network ¶
type Network struct { // Uniquely identifies the temporary network for metrics // collection. Distinct from avalanchego's concept of network ID // since the utility of special network ID values (e.g. to trigger // specific fork behavior in a given network) precludes requiring // unique network ID values across all temporary networks. UUID string // A string identifying the entity that started or maintains this // network. Useful for differentiating between networks when a // given CI job uses multiple networks. Owner string // Path where network configuration and data is stored Dir string // Id of the network. If zero, must be set in Genesis. Consider // using the GetNetworkID method if needing to retrieve the ID of // a running network. NetworkID uint32 // Genesis for the network. If nil, NetworkID must be non-zero Genesis *genesis.UnparsedConfig // Configuration for primary network chains (P, X, C) // TODO(marun) Rename to PrimaryChainConfigs ChainConfigs map[string]FlagsMap // Default configuration to use when creating new nodes DefaultFlags FlagsMap DefaultRuntimeConfig NodeRuntimeConfig // Keys pre-funded in the genesis on both the X-Chain and the C-Chain PreFundedKeys []*secp256k1.PrivateKey // Nodes that constitute the network Nodes []*Node // Subnets that have been enabled on the network Subnets []*Subnet }
Collects the configuration for running a temporary avalanchego network
func LocalNetworkOrPanic ¶ added in v1.11.6
func LocalNetworkOrPanic() *Network
func NewDefaultNetwork ¶ added in v1.11.6
func ReadNetwork ¶ added in v1.10.18
Reads a network from the provided directory.
func (*Network) Create ¶ added in v1.10.18
Creates the network on disk, generating its genesis and configuring its nodes in the process.
func (*Network) CreateSubnets ¶ added in v1.10.18
func (n *Network) CreateSubnets(ctx context.Context, log logging.Logger, apiURI string, restartRequired bool) error
Ensure that each subnet on the network is created. If restartRequired is false, node restart to pick up configuration changes becomes the responsibility of the caller.
func (*Network) DefaultGenesis ¶ added in v1.11.11
func (n *Network) DefaultGenesis() (*genesis.UnparsedConfig, error)
func (*Network) EnsureDefaultConfig ¶ added in v1.10.18
func (n *Network) EnsureDefaultConfig(log logging.Logger, avalancheGoPath string, pluginDir string) error
Initializes a new network with default configuration.
func (*Network) EnsureNodeConfig ¶ added in v1.10.18
Ensures the provided node has the configuration it needs to start. If the data dir is not set, it will be defaulted to [nodeParentDir]/[node ID]. For a not-yet-created network, no action will be taken. TODO(marun) Reword or refactor to account for the differing behavior pre- vs post-start
func (*Network) EnvFileContents ¶ added in v1.10.18
func (*Network) EnvFilePath ¶ added in v1.10.18
func (*Network) GetChainConfigDir ¶ added in v1.11.10
func (*Network) GetNetworkID ¶ added in v1.11.11
GetNetworkID returns the effective ID of the network. If the network defines a genesis, the network ID in the genesis will be returned. If a genesis is not present (i.e. a network with a genesis included in the avalanchego binary - mainnet, testnet and local), the value of the NetworkID field will be returned
func (*Network) GetNodeURIs ¶ added in v1.10.18
func (*Network) GetSubnetDir ¶ added in v1.11.10
func (*Network) GetURIForNodeID ¶ added in v1.10.18
func (*Network) RestartNode ¶ added in v1.11.4
Restart a single node.
func (*Network) StartNode ¶ added in v1.10.18
Starts the provided node after configuring it for the network.
func (*Network) StartNodes ¶ added in v1.11.7
Starts the specified nodes
func (*Network) TrackedSubnetsForNode ¶ added in v1.11.4
TrackedSubnetsForNode returns the subnet IDs for the given node
type Node ¶
type Node struct { // Uniquely identifies the network the node is part of to enable monitoring. NetworkUUID string // Identify the entity associated with this network. This is // intended to be used to label metrics to enable filtering // results for a test run between the primary/shared network used // by the majority of tests and private networks used by // individual tests. NetworkOwner string // Set by EnsureNodeID which is also called when the node is read. NodeID ids.NodeID // Flags that will be supplied to the node at startup Flags FlagsMap // An ephemeral node is not expected to be a persistent member of the network and // should therefore not be used as for bootstrapping purposes. IsEphemeral bool // The configuration used to initialize the node runtime. RuntimeConfig *NodeRuntimeConfig // Runtime state, intended to be set by NodeRuntime URI string StakingAddress netip.AddrPort // contains filtered or unexported fields }
Node supports configuring and running a node participating in a temporary network.
func NewEphemeralNode ¶ added in v1.11.4
Initializes an ephemeral node using the provided config flags
func NewNodesOrPanic ¶ added in v1.11.6
Initializes the specified number of nodes.
func (*Node) EnsureBLSSigningKey ¶ added in v1.10.18
Ensures a BLS signing key is generated if not already present.
func (*Node) EnsureKeys ¶ added in v1.10.18
Ensures staking and signing keys are generated if not already present and that the node ID (derived from the staking keypair) is set.
func (*Node) EnsureNodeID ¶ added in v1.10.18
Derives the node ID. Requires that a tls keypair is present.
func (*Node) EnsureStakingKeypair ¶ added in v1.10.18
Ensures a staking keypair is generated if not already present.
func (*Node) GetDataDir ¶ added in v1.11.6
func (*Node) GetProofOfPossession ¶ added in v1.10.18
func (n *Node) GetProofOfPossession() (*signer.ProofOfPossession, error)
Derives the nodes proof-of-possession. Requires the node to have a BLS signing key.
func (*Node) GetUniqueID ¶ added in v1.12.2
GetUniqueID returns a globally unique identifier for the node.
func (*Node) InitiateStop ¶ added in v1.10.18
func (*Node) SaveMetricsSnapshot ¶ added in v1.10.18
Writes the current state of the metrics endpoint to disk
func (*Node) SetNetworkingConfig ¶ added in v1.10.18
Sets networking configuration for the node. Convenience method for setting networking flags.
func (*Node) WaitForStopped ¶ added in v1.10.18
type NodeProcess ¶ added in v1.10.18
type NodeProcess struct {
// contains filtered or unexported fields
}
Defines local-specific node configuration. Supports setting default and node-specific values.
func (*NodeProcess) InitiateStop ¶ added in v1.10.18
func (p *NodeProcess) InitiateStop() error
Signals the node process to stop.
func (*NodeProcess) IsHealthy ¶ added in v1.10.18
func (p *NodeProcess) IsHealthy(ctx context.Context) (bool, error)
func (*NodeProcess) Start ¶ added in v1.10.18
func (p *NodeProcess) Start(log logging.Logger) error
Start waits for the process context to be written which indicates that the node will be accepting connections on its staking port. The network will start faster with this synchronization due to the avoidance of exponential backoff if a node tries to connect to a beacon that is not ready.
func (*NodeProcess) WaitForStopped ¶ added in v1.10.18
func (p *NodeProcess) WaitForStopped(ctx context.Context) error
Waits for the node process to stop.
type NodeRuntime ¶ added in v1.10.18
type NodeRuntime interface { Start(log logging.Logger) error InitiateStop() error WaitForStopped(ctx context.Context) error IsHealthy(ctx context.Context) (bool, error) // contains filtered or unexported methods }
NodeRuntime defines the methods required to support running a node.
type NodeRuntimeConfig ¶ added in v1.10.18
type NodeRuntimeConfig struct {
AvalancheGoPath string
}
Configuration required to configure a node runtime.
type RPCChainVMVersion ¶ added in v1.11.11
type RPCChainVMVersion struct {
RPCChainVM uint64 `json:"rpcchainvm"`
}
type Subnet ¶ added in v1.10.18
type Subnet struct { // A unique string that can be used to refer to the subnet across different temporary // networks (since the SubnetID will be different every time the subnet is created) Name string Config FlagsMap // The ID of the transaction that created the subnet SubnetID ids.ID // The private key that owns the subnet OwningKey *secp256k1.PrivateKey // IDs of the nodes responsible for validating the subnet ValidatorIDs []ids.NodeID Chains []*Chain }
func (*Subnet) AddValidators ¶ added in v1.10.18
func (s *Subnet) AddValidators(ctx context.Context, log logging.Logger, apiURI string, nodes ...*Node) error
Add validators to the subnet
func (*Subnet) Create ¶ added in v1.10.18
Issues the subnet creation transaction and retains the result. The URI of a node is required to issue the transaction.
func (*Subnet) CreateChains ¶ added in v1.10.18
func (*Subnet) HasChainConfig ¶ added in v1.11.0
HasChainConfig indicates whether at least one of the subnet's chains have explicit configuration. This can be used to determine whether validator restart is required after chain creation to ensure that chains are configured correctly.
type XChainBalanceMap ¶
Helper type to simplify configuring X-Chain genesis balances