Skip to content

Commit 63b7047

Browse files
committed
[tmpnet] Unify start network flag usage between e2e and tmpnetctl
1 parent ffdd6d0 commit 63b7047

File tree

11 files changed

+176
-80
lines changed

11 files changed

+176
-80
lines changed

tests/antithesis/config.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ func configForNewNetwork(
8989
duration time.Duration,
9090
) *Config {
9191
if defaultNetwork.Nodes == nil {
92-
defaultNetwork.Nodes = tmpnet.NewNodesOrPanic(flagVars.NodeCount())
92+
nodeCount, err := flagVars.NodeCount()
93+
require.NoError(tc, err)
94+
defaultNetwork.Nodes = tmpnet.NewNodesOrPanic(nodeCount)
9395
}
9496
if defaultNetwork.Subnets == nil && getSubnets != nil {
9597
defaultNetwork.Subnets = getSubnets(defaultNetwork.Nodes...)

tests/e2e/e2e_test.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,17 @@ func TestE2E(t *testing.T) {
3434
var flagVars *e2e.FlagVars
3535

3636
func init() {
37-
flagVars = e2e.RegisterFlags()
37+
flagVars = e2e.RegisterFlagsWithDefaultOwner("avalanchego-e2e")
3838
}
3939

4040
var _ = ginkgo.SynchronizedBeforeSuite(func() []byte {
4141
// Run only once in the first ginkgo process
4242

4343
tc := e2e.NewEventHandlerTestContext()
4444

45-
nodes := tmpnet.NewNodesOrPanic(flagVars.NodeCount())
45+
nodeCount, err := flagVars.NodeCount()
46+
require.NoError(tc, err)
47+
nodes := tmpnet.NewNodesOrPanic(nodeCount)
4648
subnets := vms.XSVMSubnetsOrPanic(nodes...)
4749

4850
upgrades := upgrade.Default
@@ -63,7 +65,7 @@ var _ = ginkgo.SynchronizedBeforeSuite(func() []byte {
6365
tc,
6466
flagVars,
6567
&tmpnet.Network{
66-
Owner: "avalanchego-e2e",
68+
Owner: flagVars.NetworkOwner(),
6769
DefaultFlags: tmpnet.FlagsMap{
6870
config.UpgradeFileContentKey: upgradeBase64,
6971
// Ensure a min stake duration compatible with testing staking logic

tests/fixture/e2e/env.go

+9
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ func InitSharedTestEnvironment(t require.TestingT, envBytes []byte) {
4141
}
4242

4343
type TestEnvironment struct {
44+
// The parent directory of network directories
45+
RootNetworkDir string
4446
// The directory where the test network configuration is stored
4547
NetworkDir string
4648
// URIs used to access the API endpoints of nodes of the network
@@ -61,6 +63,7 @@ func GetEnv(tc tests.TestContext) *TestEnvironment {
6163
return nil
6264
}
6365
return &TestEnvironment{
66+
RootNetworkDir: env.RootNetworkDir,
6467
NetworkDir: env.NetworkDir,
6568
URIs: env.URIs,
6669
PreFundedKey: env.PreFundedKey,
@@ -152,6 +155,9 @@ func NewTestEnvironment(tc tests.TestContext, flagVars *FlagVars, desiredNetwork
152155

153156
// Start a new network
154157
if network == nil {
158+
// TODO(marun) Maybe accept a factory function for the desired network
159+
// that is only run when a new network will be started?
160+
155161
network = desiredNetwork
156162
runtimeConfig, err := flagVars.NodeRuntimeConfig()
157163
require.NoError(err)
@@ -160,6 +166,7 @@ func NewTestEnvironment(tc tests.TestContext, flagVars *FlagVars, desiredNetwork
160166
StartNetwork(
161167
tc,
162168
network,
169+
flagVars.RootNetworkDir(),
163170
flagVars.NetworkShutdownDelay(),
164171
flagVars.StartNetwork(),
165172
flagVars.ReuseNetwork(),
@@ -189,6 +196,7 @@ func NewTestEnvironment(tc tests.TestContext, flagVars *FlagVars, desiredNetwork
189196
)
190197

191198
return &TestEnvironment{
199+
RootNetworkDir: flagVars.RootNetworkDir(),
192200
NetworkDir: network.Dir,
193201
URIs: uris,
194202
PrivateNetworkShutdownDelay: flagVars.NetworkShutdownDelay(),
@@ -231,6 +239,7 @@ func (te *TestEnvironment) StartPrivateNetwork(network *tmpnet.Network) {
231239
StartNetwork(
232240
te.testContext,
233241
network,
242+
te.RootNetworkDir,
234243
te.PrivateNetworkShutdownDelay,
235244
false, /* skipShutdown */
236245
false, /* reuseNetwork */

tests/fixture/e2e/flags.go

+63-47
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,46 @@ import (
1616
)
1717

1818
type FlagVars struct {
19-
runtimeConfigVars *flags.RuntimeConfigVars
20-
networkDir string
21-
reuseNetwork bool
22-
startCollectors bool
23-
checkMonitoring bool
24-
startNetwork bool
25-
stopNetwork bool
26-
restartNetwork bool
27-
nodeCount int
28-
activateFortuna bool
19+
startNetwork bool
20+
startNetworkVars *flags.StartNetworkVars
21+
22+
startCollectors bool
23+
checkMonitoring bool
24+
25+
networkDir string
26+
reuseNetwork bool
27+
restartNetwork bool
28+
stopNetwork bool
29+
30+
activateFortuna bool
31+
}
32+
33+
func (v *FlagVars) StartNetwork() bool {
34+
return v.startNetwork
35+
}
36+
37+
func (v *FlagVars) RootNetworkDir() string {
38+
return v.startNetworkVars.RootNetworkDir
39+
}
40+
41+
func (v *FlagVars) NetworkOwner() string {
42+
return v.startNetworkVars.NetworkOwner
43+
}
44+
45+
func (v *FlagVars) NodeCount() (int, error) {
46+
return v.startNetworkVars.GetNodeCount()
2947
}
3048

3149
func (v *FlagVars) NodeRuntimeConfig() (*tmpnet.NodeRuntimeConfig, error) {
32-
return v.runtimeConfigVars.GetNodeRuntimeConfig()
50+
return v.startNetworkVars.GetNodeRuntimeConfig()
51+
}
52+
53+
func (v *FlagVars) StartCollectors() bool {
54+
return v.startCollectors
55+
}
56+
57+
func (v *FlagVars) CheckMonitoring() bool {
58+
return v.checkMonitoring
3359
}
3460

3561
func (v *FlagVars) NetworkDir() string {
@@ -50,12 +76,8 @@ func (v *FlagVars) RestartNetwork() bool {
5076
return v.restartNetwork
5177
}
5278

53-
func (v *FlagVars) StartCollectors() bool {
54-
return v.startCollectors
55-
}
56-
57-
func (v *FlagVars) CheckMonitoring() bool {
58-
return v.checkMonitoring
79+
func (v *FlagVars) StopNetwork() bool {
80+
return v.stopNetwork
5981
}
6082

6183
func (v *FlagVars) NetworkShutdownDelay() time.Duration {
@@ -67,65 +89,59 @@ func (v *FlagVars) NetworkShutdownDelay() time.Duration {
6789
return 0
6890
}
6991

70-
func (v *FlagVars) StartNetwork() bool {
71-
return v.startNetwork
72-
}
73-
74-
func (v *FlagVars) StopNetwork() bool {
75-
return v.stopNetwork
76-
}
77-
78-
func (v *FlagVars) NodeCount() int {
79-
return v.nodeCount
80-
}
81-
8292
func (v *FlagVars) ActivateFortuna() bool {
8393
return v.activateFortuna
8494
}
8595

8696
func RegisterFlags() *FlagVars {
97+
return RegisterFlagsWithDefaultOwner("")
98+
}
99+
100+
func RegisterFlagsWithDefaultOwner(defaultOwner string) *FlagVars {
87101
vars := FlagVars{}
88-
vars.runtimeConfigVars = flags.NewRuntimeConfigFlagVars()
102+
103+
flag.BoolVar(
104+
&vars.startNetwork,
105+
"start-network",
106+
false,
107+
"[optional] start a new network and exit without executing any tests. The new network cannot be reused with --reuse-network. Ignored if either --reuse-network or --stop-network is provided.",
108+
)
109+
110+
vars.startNetworkVars = flags.NewStartNetworkFlagVars(defaultOwner)
111+
112+
SetMonitoringFlags(
113+
&vars.startCollectors,
114+
&vars.checkMonitoring,
115+
)
116+
89117
flag.StringVar(
90118
&vars.networkDir,
91119
"network-dir",
92120
"",
93-
fmt.Sprintf("[optional] the dir containing the configuration of an existing network to target for testing. Will only be used if --reuse-network is specified. Also possible to configure via the %s env variable.", tmpnet.NetworkDirEnvName),
121+
fmt.Sprintf("[optional] the dir containing the configuration of an existing network. Will only be used if --reuse-network, --restart-network or --stop-network are specified. Also possible to configure via the %s env variable.", tmpnet.NetworkDirEnvName),
94122
)
123+
95124
flag.BoolVar(
96125
&vars.reuseNetwork,
97126
"reuse-network",
98127
false,
99128
"[optional] reuse an existing network previously started with --reuse-network. If a network is not already running, create a new one and leave it running for subsequent usage. Ignored if --stop-network is provided.",
100129
)
130+
101131
flag.BoolVar(
102132
&vars.restartNetwork,
103133
"restart-network",
104134
false,
105135
"[optional] restart an existing network previously started with --reuse-network. Useful for ensuring a network is running with the current state of binaries on disk. Ignored if a network is not already running or --stop-network is provided.",
106136
)
107-
SetMonitoringFlags(
108-
&vars.startCollectors,
109-
&vars.checkMonitoring,
110-
)
111-
flag.BoolVar(
112-
&vars.startNetwork,
113-
"start-network",
114-
false,
115-
"[optional] start a new network and exit without executing any tests. The new network cannot be reused with --reuse-network. Ignored if either --reuse-network or --stop-network is provided.",
116-
)
137+
117138
flag.BoolVar(
118139
&vars.stopNetwork,
119140
"stop-network",
120141
false,
121142
"[optional] stop an existing network started with --reuse-network and exit without executing any tests.",
122143
)
123-
flag.IntVar(
124-
&vars.nodeCount,
125-
"node-count",
126-
tmpnet.DefaultNodeCount,
127-
"number of nodes the network should initially consist of",
128-
)
144+
129145
flag.BoolVar(
130146
&vars.activateFortuna,
131147
"activate-fortuna",

tests/fixture/e2e/helpers.go

+2-5
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,6 @@ const (
4646

4747
DefaultGasLimit = uint64(21000) // Standard gas limit
4848

49-
// An empty string prompts the use of the default path which ensures a
50-
// predictable target for github's upload-artifact action.
51-
DefaultNetworkDir = ""
52-
5349
// Directory used to store private networks (specific to a single test)
5450
// under the shared network dir.
5551
PrivateNetworksDirName = "private_networks"
@@ -272,6 +268,7 @@ func CheckBootstrapIsPossible(tc tests.TestContext, network *tmpnet.Network) *tm
272268
func StartNetwork(
273269
tc tests.TestContext,
274270
network *tmpnet.Network,
271+
rootNetworkDir string,
275272
shutdownDelay time.Duration,
276273
skipShutdown bool,
277274
reuseNetwork bool,
@@ -282,7 +279,7 @@ func StartNetwork(
282279
tc.DefaultContext(),
283280
tc.Log(),
284281
network,
285-
DefaultNetworkDir,
282+
rootNetworkDir,
286283
)
287284
if err != nil {
288285
tc.DeferCleanup(func() {

tests/fixture/tmpnet/README.md

+7-6
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ the following non-test files:
6363
| flags/common.go | | Defines type definitions common across other files |
6464
| flags/process_runtime.go | | Defines flags configuring the process node runtime |
6565
| flags/runtime.go | | Defines flags configuring node runtime |
66+
| flags/start_network.go | | Defines flags configuring network start |
6667
| tmpnetctl/ | | Directory containing main entrypoint for tmpnetctl command |
6768
| check_monitoring.go | | Enables checking if logs and metrics were collected |
6869
| defaults.go | | Defines common default configuration |
@@ -269,12 +270,12 @@ this file (i.e. `source network.env`) in a shell will configure ginkgo
269270
e2e and the `tmpnetctl` cli to target the network path specified in
270271
the env var.
271272

272-
Set `TMPNET_ROOT_DIR` to specify the root directory in which to create
273-
the configuration directory of new networks
274-
(e.g. `$TMPNET_ROOT_DIR/[network-dir]`). The default root directory is
275-
`~/.tmpdir/networks`. Configuring the root directory is only relevant
276-
when creating new networks as the path of existing networks will
277-
already have been set.
273+
Set `TMPNET_ROOT_NETWORK_DIR` to specify the root network directory in
274+
which to create the configuration directory of new networks
275+
(e.g. `TMPNET_ROOT_NETWORK_DIR/[network-dir]`). The default network
276+
root directory is `~/.tmpdir/networks`. Configuring the network root
277+
directory is only relevant when creating new networks as the path of
278+
existing networks will already have been set.
278279

279280
### Node configuration
280281
[Top](#table-of-contents)

tests/fixture/tmpnet/flags/common.go

+2
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,5 @@ package flags
1010
type stringVarFunc func(p *string, name string, value string, usage string)
1111

1212
type boolVarFunc func(p *bool, name string, value bool, usage string)
13+
14+
type intVarFunc func(p *int, name string, value int, usage string)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
2+
// See the file LICENSE for licensing terms.
3+
4+
package flags
5+
6+
import (
7+
"flag"
8+
"fmt"
9+
10+
"github.com/spf13/pflag"
11+
12+
"github.com/ava-labs/avalanchego/tests/fixture/tmpnet"
13+
)
14+
15+
type StartNetworkVars struct {
16+
// Accessible directly
17+
RootNetworkDir string
18+
NetworkOwner string
19+
20+
// Accessible via a validating method
21+
nodeCount int
22+
runtimeVars *RuntimeConfigVars
23+
24+
defaultNetworkOwner string
25+
}
26+
27+
func NewStartNetworkFlagVars(defaultNetworkOwner string) *StartNetworkVars {
28+
v := &StartNetworkVars{defaultNetworkOwner: defaultNetworkOwner}
29+
v.runtimeVars = NewRuntimeConfigFlagVars()
30+
v.register(flag.StringVar, flag.IntVar)
31+
return v
32+
}
33+
34+
func NewStartNetworkFlagSetVars(flagSet *pflag.FlagSet, defaultNetworkOwner string) *StartNetworkVars {
35+
v := &StartNetworkVars{defaultNetworkOwner: defaultNetworkOwner}
36+
v.runtimeVars = NewRuntimeConfigFlagSetVars(flagSet)
37+
v.register(flagSet.StringVar, flagSet.IntVar)
38+
return v
39+
}
40+
41+
func (v *StartNetworkVars) register(stringVar stringVarFunc, intVar intVarFunc) {
42+
stringVar(
43+
&v.RootNetworkDir,
44+
"root-network-dir",
45+
// An empty string prompts the use of the default path.
46+
tmpnet.GetEnvWithDefault(tmpnet.RootNetworkDirEnvName, ""),
47+
fmt.Sprintf("The directory in which to create the network directory. Also possible to configure via the %s env variable.", tmpnet.RootNetworkDirEnvName),
48+
)
49+
stringVar(
50+
&v.NetworkOwner,
51+
"network-owner",
52+
v.defaultNetworkOwner,
53+
"The string identifying the intended owner of the network")
54+
intVar(
55+
&v.nodeCount,
56+
"node-count",
57+
tmpnet.DefaultNodeCount,
58+
"Number of nodes the network should initially consist of",
59+
)
60+
}
61+
62+
func (v *StartNetworkVars) GetNodeCount() (int, error) {
63+
if v.nodeCount < 1 {
64+
return 0, fmt.Errorf("--node-count must be greater than 0 but got %d", v.nodeCount)
65+
}
66+
return v.nodeCount, nil
67+
}
68+
69+
func (v *StartNetworkVars) GetNodeRuntimeConfig() (*tmpnet.NodeRuntimeConfig, error) {
70+
return v.runtimeVars.GetNodeRuntimeConfig()
71+
}

tests/fixture/tmpnet/network.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ import (
4242
const (
4343
// Constants defining the names of shell variables whose value can
4444
// configure network orchestration.
45-
NetworkDirEnvName = "TMPNET_NETWORK_DIR"
46-
RootDirEnvName = "TMPNET_ROOT_DIR"
45+
RootNetworkDirEnvName = "TMPNET_ROOT_NETWORK_DIR"
46+
NetworkDirEnvName = "TMPNET_NETWORK_DIR"
4747

4848
// Message to log indicating where to look for metrics and logs for network
4949
MetricsAvailableMessage = "metrics and logs available via grafana (collectors must be running)"

0 commit comments

Comments
 (0)