Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use unique names for relayer images & cleanup when purpose served #1269

Merged
merged 3 commits into from
Aug 29, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions interchaintest/client_threshold_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,16 @@ func TestScenarioClientThresholdUpdate(t *testing.T) {
g0, g1 := chains[0], chains[1]

client, network := interchaintest.DockerSetup(t)
relayerinterchaintest.BuildRelayerImage(t)
uuid := relayerinterchaintest.UniqueRelayerImageName()
relayerinterchaintest.BuildRelayerImage(t, uuid)

// Relayer is set with "--time-threshold 5m"
// The client being created below also has a trusting period of 5m.
// The relayer should automatically update the client after chains re in sync.
r := interchaintest.NewBuiltinRelayerFactory(
ibc.CosmosRly,
zaptest.NewLogger(t),
interchaintestrelayer.CustomDockerImage(relayerinterchaintest.RelayerImageName, "latest", "100:1000"),
interchaintestrelayer.CustomDockerImage(uuid, "latest", "100:1000"),
interchaintestrelayer.ImagePull(false),
interchaintestrelayer.StartupFlags("--time-threshold", "20s"),
).Build(t, client, network)
Expand Down Expand Up @@ -102,6 +103,7 @@ func TestScenarioClientThresholdUpdate(t *testing.T) {
require.NoError(t, r.StartRelayer(ctx, eRep, ibcPath))
t.Cleanup(func() {
_ = r.StopRelayer(ctx, eRep)
relayerinterchaintest.DestroyRelayerImage(t, uuid)
})

const heightOffset = 10
Expand Down Expand Up @@ -164,15 +166,16 @@ func TestScenarioClientTrustingPeriodUpdate(t *testing.T) {
g0, g1 := chains[0], chains[1]

client, network := interchaintest.DockerSetup(t)
relayerinterchaintest.BuildRelayerImage(t)
uuid := relayerinterchaintest.UniqueRelayerImageName()
vimystic marked this conversation as resolved.
Show resolved Hide resolved
relayerinterchaintest.BuildRelayerImage(t, uuid)
logger := zaptest.NewLogger(t)

// Relayer is set with "--time-threshold 0"
// The Relayer should NOT continuously update clients
r := interchaintest.NewBuiltinRelayerFactory(
ibc.CosmosRly,
logger,
interchaintestrelayer.CustomDockerImage(relayerinterchaintest.RelayerImageName, "latest", "100:1000"),
zaptest.NewLogger(t),
vimystic marked this conversation as resolved.
Show resolved Hide resolved
interchaintestrelayer.CustomDockerImage(uuid, "latest", "100:1000"),
interchaintestrelayer.ImagePull(false),
).Build(t, client, network)

Expand Down
28 changes: 25 additions & 3 deletions interchaintest/docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,12 @@ import (

dockertypes "github.com/docker/docker/api/types"
"github.com/docker/docker/pkg/archive"
"github.com/google/uuid"
"github.com/moby/moby/client"
"github.com/stretchr/testify/require"
)

const RelayerImageName = "interchaintestrelayer"
const RelayerImagePrefix = "interchaintestrelayer"

type dockerLogLine struct {
Stream string `json:"stream"`
Expand All @@ -29,7 +30,15 @@ type dockerErrorDetail struct {
Message string `json:"message"`
}

func BuildRelayerImage(t *testing.T) {
func UniqueRelayerImageName() string {
uuid, err := uuid.NewRandom()
if err != nil {
fmt.Printf("Failed to generate UUID: %v\n", err)
vimystic marked this conversation as resolved.
Show resolved Hide resolved
vimystic marked this conversation as resolved.
Show resolved Hide resolved
}
return RelayerImagePrefix + uuid.String()[:6]
}

func BuildRelayerImage(t *testing.T, uniquestr string) {
vimystic marked this conversation as resolved.
Show resolved Hide resolved
vimystic marked this conversation as resolved.
Show resolved Hide resolved
_, b, _, _ := runtime.Caller(0)
basepath := filepath.Join(filepath.Dir(b), "..")

Expand All @@ -41,14 +50,27 @@ func BuildRelayerImage(t *testing.T) {

res, err := cli.ImageBuild(context.Background(), tar, dockertypes.ImageBuildOptions{
Dockerfile: "local.Dockerfile",
Tags: []string{RelayerImageName},
Tags: []string{uniquestr},
})
require.NoError(t, err, "error building docker image")

defer res.Body.Close()
handleDockerBuildOutput(t, res.Body)
}

func DestroyRelayerImage(t *testing.T, uniquestr string) {
vimystic marked this conversation as resolved.
Show resolved Hide resolved
// Create a Docker client
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
require.NoError(t, err, "error building docker client")

// Remove the Docker image using the provided tag (uniquestr)
_, err = cli.ImageRemove(context.Background(), uniquestr, dockertypes.ImageRemoveOptions{
Force: true, // Force remove the image
PruneChildren: true, // Remove all child images
})
require.NoError(t, err, "error removing docker image")
}

func handleDockerBuildOutput(t *testing.T, body io.Reader) {
var logLine dockerLogLine

Expand Down
24 changes: 15 additions & 9 deletions interchaintest/ibc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import (
// so it uses only one pair of chains.
//
// The canonical set of test chains are defined in the interchaintest repository.
func interchaintestConformance(t *testing.T, rf interchaintest.RelayerFactory) {
func interchaintestConformance(t *testing.T, rf interchaintest.RelayerFactory, uuid string) {
vimystic marked this conversation as resolved.
Show resolved Hide resolved
cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{
{Name: "gaia", Version: "v7.0.1", ChainConfig: ibc.ChainConfig{ChainID: "cosmoshub-1004"}},
{Name: "osmosis", Version: "v7.2.0", ChainConfig: ibc.ChainConfig{ChainID: "osmosis-1001"}},
Expand All @@ -33,13 +33,16 @@ func interchaintestConformance(t *testing.T, rf interchaintest.RelayerFactory) {
[]interchaintest.RelayerFactory{rf},
testreporter.NewNopReporter(),
)
if uuid != "" {
relayerinterchaintest.DestroyRelayerImage(t, uuid)
Copy link
Member

@agouin agouin Aug 29, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should be done in a t.Cleanup. i.e. this change can go away one the DestroyRelayerImage logic is moved to the t.Cleanup call within BuildRelayerImage

}
}

// TestRelayerInProcess runs the interchaintest conformance tests against
// the current state of this relayer implementation running in process.
func TestRelayerInProcess(t *testing.T) {
t.Parallel()
interchaintestConformance(t, relayerinterchaintest.RelayerFactory{})
interchaintestConformance(t, relayerinterchaintest.RelayerFactory{}, "")
}

// TestRelayerDockerEventProcessor runs the interchaintest conformance tests against
Expand All @@ -48,33 +51,36 @@ func TestRelayerInProcess(t *testing.T) {
func TestRelayerDockerEventProcessor(t *testing.T) {
t.Parallel()

uuid := relayerinterchaintest.UniqueRelayerImageName()
vimystic marked this conversation as resolved.
Show resolved Hide resolved
relayerinterchaintest.BuildRelayerImage(t, uuid)
vimystic marked this conversation as resolved.
Show resolved Hide resolved
rf := interchaintest.NewBuiltinRelayerFactory(
ibc.CosmosRly,
zaptest.NewLogger(t),
interchaintestrelayer.CustomDockerImage(relayerinterchaintest.RelayerImageName, "latest", "100:1000"),
interchaintestrelayer.CustomDockerImage(uuid, "latest", "100:1000"),
interchaintestrelayer.ImagePull(false),
interchaintestrelayer.StartupFlags("--processor", "events", "--block-history", "100"),
)

interchaintestConformance(t, rf)
interchaintestConformance(t, rf, uuid)
}

// TestRelayerDockerLegacyProcessor runs the interchaintest conformance tests against
// the current state of this relayer implementation built in docker.
// Relayer runs using the legacy processor.
func TestRelayerDockerLegacyProcessor(t *testing.T) {
t.Parallel()
relayerinterchaintest.BuildRelayerImage(t)
uuid := relayerinterchaintest.UniqueRelayerImageName()
vimystic marked this conversation as resolved.
Show resolved Hide resolved
relayerinterchaintest.BuildRelayerImage(t, uuid)

rf := interchaintest.NewBuiltinRelayerFactory(
ibc.CosmosRly,
zaptest.NewLogger(t),
interchaintestrelayer.CustomDockerImage(relayerinterchaintest.RelayerImageName, "latest", "100:1000"),
interchaintestrelayer.CustomDockerImage(uuid, "latest", "100:1000"),
interchaintestrelayer.ImagePull(false),
interchaintestrelayer.StartupFlags("--processor", "legacy"),
)

interchaintestConformance(t, rf)
interchaintestConformance(t, rf, uuid)
}

// TestRelayerEventProcessor runs the interchaintest conformance tests against
Expand All @@ -86,7 +92,7 @@ func TestRelayerEventProcessor(t *testing.T) {
interchaintestConformance(t, relayerinterchaintest.NewRelayerFactory(relayerinterchaintest.RelayerConfig{
Processor: relayer.ProcessorEvents,
InitialBlockHistory: 0,
}))
}), "")
}

// TestRelayerLegacyProcessor runs the interchaintest conformance tests against
Expand All @@ -97,5 +103,5 @@ func TestRelayerLegacyProcessor(t *testing.T) {

interchaintestConformance(t, relayerinterchaintest.NewRelayerFactory(relayerinterchaintest.RelayerConfig{
Processor: relayer.ProcessorLegacy,
}))
}), "")
}
6 changes: 4 additions & 2 deletions interchaintest/multi_channel_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,14 @@ import (
)

func TestMultipleChannelsOneConnection(t *testing.T) {
relayerinterchaintest.BuildRelayerImage(t)
uuid := relayerinterchaintest.UniqueRelayerImageName()
vimystic marked this conversation as resolved.
Show resolved Hide resolved
relayerinterchaintest.BuildRelayerImage(t, uuid)

client, network := interchaintest.DockerSetup(t)
r := interchaintest.NewBuiltinRelayerFactory(
ibc.CosmosRly,
zaptest.NewLogger(t),
interchaintestrelayer.CustomDockerImage(relayerinterchaintest.RelayerImageName, "latest", "100:1000"),
interchaintestrelayer.CustomDockerImage(uuid, "latest", "100:1000"),
interchaintestrelayer.ImagePull(false),
).Build(t, client, network)

Expand Down Expand Up @@ -109,6 +110,7 @@ func TestMultipleChannelsOneConnection(t *testing.T) {
if err != nil {
t.Logf("an error occured while stopping the relayer: %s", err)
}
relayerinterchaintest.DestroyRelayerImage(t, uuid)
},
)

Expand Down
6 changes: 4 additions & 2 deletions interchaintest/relayer_override_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,14 @@ import (
// is a client-id present in the relative path config. If the override flag is present, the relayer should always
// attempt to create a new light client and then overwrite the config file if successful.
func TestClientOverrideFlag(t *testing.T) {
relayerinterchaintest.BuildRelayerImage(t)
uuid := relayerinterchaintest.UniqueRelayerImageName()
relayerinterchaintest.BuildRelayerImage(t, uuid)

client, network := interchaintest.DockerSetup(t)
r := interchaintest.NewBuiltinRelayerFactory(
ibc.CosmosRly,
zaptest.NewLogger(t),
interchaintestrelayer.CustomDockerImage(relayerinterchaintest.RelayerImageName, "latest", "100:1000"),
interchaintestrelayer.CustomDockerImage(uuid, "latest", "100:1000"),
interchaintestrelayer.ImagePull(false),
).Build(t, client, network)

Expand Down Expand Up @@ -95,6 +96,7 @@ func TestClientOverrideFlag(t *testing.T) {
if err != nil {
t.Logf("an error occured while stopping the relayer: %s", err)
}
relayerinterchaintest.DestroyRelayerImage(t, uuid)
},
)

Expand Down
Loading