Skip to content

Commit 36f1837

Browse files
committed
[tmpnet] Refactor in preparation for addition of kube runtime
- move process-specific behavior into ProcessRuntime - save API port - process-specific default and computed flags - move runtime-agnostic code (like github labels) from ProcessRuntime to Node - add restart method to enable the runtime to determine this behavior (stop/start for processes but scale down/scale up for kube) - ensure all runtime methods accept a context to account for needing make network calls in the kube runtime - add a log field to tmpnet.Network to ensure a log is always available to runtime methods
1 parent 62f6308 commit 36f1837

16 files changed

+361
-287
lines changed

tests/antithesis/compose.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ func newComposeProject(network *tmpnet.Network, nodeImageName string, workloadIm
174174
}
175175

176176
// Apply configuration appropriate to a test network
177-
for k, v := range tmpnet.DefaultTestFlags() {
177+
for k, v := range tmpnet.DefaultTmpnetFlags() {
178178
switch value := v.(type) {
179179
case string:
180180
env[k] = value

tests/e2e/e2e_test.go

+13-9
Original file line numberDiff line numberDiff line change
@@ -61,23 +61,27 @@ var _ = ginkgo.SynchronizedBeforeSuite(func() []byte {
6161
require.NoError(tc, err)
6262

6363
upgradeBase64 := base64.StdEncoding.EncodeToString(upgradeJSON)
64+
65+
defaultFlags := tmpnet.FlagsMap{
66+
config.UpgradeFileContentKey: upgradeBase64,
67+
// Ensure a min stake duration compatible with testing staking logic
68+
config.MinStakeDurationKey: "1s",
69+
}
70+
defaultFlags.SetDefaults(tmpnet.DefaultE2EFlags())
71+
6472
return e2e.NewTestEnvironment(
6573
tc,
6674
flagVars,
6775
&tmpnet.Network{
68-
Owner: flagVars.NetworkOwner(),
69-
DefaultFlags: tmpnet.FlagsMap{
70-
config.UpgradeFileContentKey: upgradeBase64,
71-
// Ensure a min stake duration compatible with testing staking logic
72-
config.MinStakeDurationKey: tmpnet.DefaultMinStakeDuration,
73-
},
74-
Nodes: nodes,
75-
Subnets: subnets,
76+
Owner: flagVars.NetworkOwner(),
77+
DefaultFlags: defaultFlags,
78+
Nodes: nodes,
79+
Subnets: subnets,
7680
},
7781
).Marshal()
7882
}, func(envBytes []byte) {
7983
// Run in every ginkgo process
8084

8185
// Initialize the local test environment from the global state
82-
e2e.InitSharedTestEnvironment(ginkgo.GinkgoT(), envBytes)
86+
e2e.InitSharedTestEnvironment(e2e.NewTestContext(), envBytes)
8387
})

tests/e2e/faultinjection/duplicate_node_id.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ var _ = ginkgo.Describe("Duplicate node handling", func() {
4444
_ = e2e.AddEphemeralNode(tc, network, node2)
4545

4646
tc.By("checking that the second new node fails to become healthy before timeout")
47-
err := tmpnet.WaitForHealthy(tc.DefaultContext(), node2)
47+
err := tmpnet.WaitForHealthyNode(tc.DefaultContext(), tc.Log(), node2)
4848
require.ErrorIs(err, context.DeadlineExceeded)
4949

5050
tc.By("stopping the first new node")

tests/fixture/e2e/env.go

+12-9
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,12 @@ import (
2626
// access to the shared env to GetEnv which adds a test context.
2727
var env *TestEnvironment
2828

29-
func InitSharedTestEnvironment(t require.TestingT, envBytes []byte) {
30-
require := require.New(t)
29+
func InitSharedTestEnvironment(tc tests.TestContext, envBytes []byte) {
30+
require := require.New(tc)
3131
require.Nil(env, "env already initialized")
3232
env = &TestEnvironment{}
3333
require.NoError(json.Unmarshal(envBytes, env))
34+
env.testContext = tc
3435

3536
// Ginkgo parallelization is at the process level, so a given key
3637
// can safely be used by all tests in a given process without fear
@@ -126,7 +127,7 @@ func NewTestEnvironment(tc tests.TestContext, flagVars *FlagVars, desiredNetwork
126127

127128
if len(networkDir) > 0 {
128129
var err error
129-
network, err = tmpnet.ReadNetwork(networkDir)
130+
network, err = tmpnet.ReadNetwork(tc.DefaultContext(), tc.Log(), networkDir)
130131
require.NoError(err)
131132
tc.Log().Info("loaded a network",
132133
zap.String("networkDir", networkDir),
@@ -153,7 +154,7 @@ func NewTestEnvironment(tc tests.TestContext, flagVars *FlagVars, desiredNetwork
153154
}
154155

155156
if network != nil && networkCmd == RestartNetworkCmd {
156-
require.NoError(network.Restart(tc.DefaultContext(), tc.Log()))
157+
require.NoError(network.Restart(tc.DefaultContext()))
157158
}
158159
}
159160

@@ -221,8 +222,9 @@ func (te *TestEnvironment) GetRandomNodeURI() tmpnet.NodeURI {
221222

222223
// Retrieve the network to target for testing.
223224
func (te *TestEnvironment) GetNetwork() *tmpnet.Network {
224-
network, err := tmpnet.ReadNetwork(te.NetworkDir)
225-
require.NoError(te.testContext, err)
225+
tc := te.testContext
226+
network, err := tmpnet.ReadNetwork(tc.DefaultContext(), tc.Log(), te.NetworkDir)
227+
require.NoError(tc, err)
226228
return network
227229
}
228230

@@ -233,14 +235,15 @@ func (te *TestEnvironment) NewKeychain() *secp256k1fx.Keychain {
233235

234236
// Create a new private network that is not shared with other tests.
235237
func (te *TestEnvironment) StartPrivateNetwork(network *tmpnet.Network) {
236-
require := require.New(te.testContext)
238+
tc := te.testContext
239+
require := require.New(tc)
237240
// Use the same configuration as the shared network
238-
sharedNetwork, err := tmpnet.ReadNetwork(te.NetworkDir)
241+
sharedNetwork, err := tmpnet.ReadNetwork(tc.DefaultContext(), tc.Log(), te.NetworkDir)
239242
require.NoError(err)
240243
network.DefaultRuntimeConfig = sharedNetwork.DefaultRuntimeConfig
241244

242245
StartNetwork(
243-
te.testContext,
246+
tc,
244247
network,
245248
te.RootNetworkDir,
246249
te.PrivateNetworkShutdownDelay,

tests/fixture/e2e/helpers.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func NewEthClient(tc tests.TestContext, nodeURI tmpnet.NodeURI) ethclient.Client
136136
func AddEphemeralNode(tc tests.TestContext, network *tmpnet.Network, node *tmpnet.Node) *tmpnet.Node {
137137
require := require.New(tc)
138138

139-
require.NoError(network.StartNode(tc.DefaultContext(), tc.Log(), node))
139+
require.NoError(network.StartNode(tc.DefaultContext(), node))
140140

141141
tc.DeferCleanup(func() {
142142
tc.Log().Info("shutting down ephemeral node",
@@ -150,11 +150,11 @@ func AddEphemeralNode(tc tests.TestContext, network *tmpnet.Network, node *tmpne
150150
}
151151

152152
// Wait for the given node to report healthy.
153-
func WaitForHealthy(t require.TestingT, node *tmpnet.Node) {
153+
func WaitForHealthy(tc tests.TestContext, node *tmpnet.Node) {
154154
// Need to use explicit context (vs DefaultContext()) to support use with DeferCleanup
155155
ctx, cancel := context.WithTimeout(context.Background(), DefaultTimeout)
156156
defer cancel()
157-
require.NoError(t, tmpnet.WaitForHealthy(ctx, node))
157+
require.NoError(tc, tmpnet.WaitForHealthyNode(ctx, tc.Log(), node))
158158
}
159159

160160
// Sends an eth transaction and waits for the transaction receipt from the
@@ -236,7 +236,7 @@ func CheckBootstrapIsPossible(tc tests.TestContext, network *tmpnet.Network) *tm
236236
}
237237

238238
node := tmpnet.NewEphemeralNode(flags)
239-
require.NoError(network.StartNode(tc.DefaultContext(), tc.Log(), node))
239+
require.NoError(network.StartNode(tc.DefaultContext(), node))
240240
// StartNode will initiate node stop if an error is encountered during start,
241241
// so no further cleanup effort is required if an error is seen here.
242242

@@ -248,7 +248,7 @@ func CheckBootstrapIsPossible(tc tests.TestContext, network *tmpnet.Network) *tm
248248
})
249249

250250
// Check that the node becomes healthy within timeout
251-
require.NoError(tmpnet.WaitForHealthy(tc.DefaultContext(), node))
251+
require.NoError(tmpnet.WaitForHealthyNode(tc.DefaultContext(), tc.Log(), node))
252252

253253
// Ensure that the primary validators are still healthy
254254
for _, node := range network.Nodes {

tests/fixture/tmpnet/check_monitoring.go

+5-9
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"math"
1414
"net/http"
1515
"net/url"
16+
"os"
1617
"strconv"
1718
"strings"
1819
"time"
@@ -271,16 +272,11 @@ func getSelectors(networkUUID string) (string, error) {
271272

272273
// Fall back to using Github labels as selectors
273274
selectors := []string{}
274-
githubLabels := githubLabelsFromEnv()
275-
for label := range githubLabels {
276-
value, err := githubLabels.GetStringVal(label)
277-
if err != nil {
278-
return "", err
275+
for _, label := range githubLabels {
276+
value := os.Getenv(strings.ToUpper(label))
277+
if len(value) > 0 {
278+
selectors = append(selectors, fmt.Sprintf(`%s="%s"`, label, value))
279279
}
280-
if len(value) == 0 {
281-
continue
282-
}
283-
selectors = append(selectors, fmt.Sprintf(`%s="%s"`, label, value))
284280
}
285281
if len(selectors) == 0 {
286282
return "", errors.New("no GH_* env vars set to use for selectors")

tests/fixture/tmpnet/defaults.go

+6-18
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ const (
3535
defaultConfigFilename = "config.json"
3636
)
3737

38-
// Flags appropriate for networks used for all types of testing.
39-
func DefaultTestFlags() FlagsMap {
38+
// Flags suggested for temporary networks. Applied by default.
39+
func DefaultTmpnetFlags() FlagsMap {
4040
return FlagsMap{
4141
config.NetworkPeerListPullGossipFreqKey: "250ms",
4242
config.NetworkMaxReconnectDelayKey: "1s",
@@ -46,26 +46,14 @@ func DefaultTestFlags() FlagsMap {
4646
}
4747
}
4848

49-
// Flags appropriate for tmpnet networks.
50-
func DefaultTmpnetFlags() FlagsMap {
51-
// Supply only non-default configuration to ensure that default values will be used.
52-
flags := FlagsMap{
53-
// Default to dynamic port allocation
54-
config.HTTPPortKey: "0",
55-
config.StakingPortKey: "0",
56-
// Specific to tmpnet deployment
57-
config.PublicIPKey: "127.0.0.1",
58-
config.HTTPHostKey: "127.0.0.1",
59-
config.StakingHostKey: "127.0.0.1",
60-
config.LogDisplayLevelKey: logging.Off.String(), // Display logging not needed since nodes run headless
61-
config.LogLevelKey: logging.Debug.String(),
62-
// Specific to e2e testing
49+
// Flags suggested for e2e testing
50+
func DefaultE2EFlags() FlagsMap {
51+
return FlagsMap{
6352
config.ProposerVMUseCurrentHeightKey: true,
6453
// Reducing this from the 1s default speeds up tx acceptance
6554
config.ProposerVMMinBlockDelayKey: "0s",
55+
config.LogLevelKey: logging.Debug.String(),
6656
}
67-
flags.SetDefaults(DefaultTestFlags())
68-
return flags
6957
}
7058

7159
// A set of chain configurations appropriate for testing.

0 commit comments

Comments
 (0)