From cc35cd35adbcddff63f250c7a497f64c5e67a9bf Mon Sep 17 00:00:00 2001 From: Debendra Oli Date: Fri, 18 Aug 2023 01:00:35 +0545 Subject: [PATCH] feat: ability to pause and resume containers (#692) * feat: ability to pause and resume relayer * feat: ability to pause node containers * fix: typo * rf: return error message when container is not running --------- Co-authored-by: Dan Kanefsky <56059752+boojamya@users.noreply.github.com> --- chain/cosmos/chain_node.go | 23 ++++++++++++++++++++-- chain/cosmos/sidecar.go | 11 ++++++++++- ibc/relayer.go | 6 ++++++ internal/dockerutil/container_lifecycle.go | 11 ++++++++++- relayer/docker.go | 17 +++++++++++++++- 5 files changed, 63 insertions(+), 5 deletions(-) diff --git a/chain/cosmos/chain_node.go b/chain/cosmos/chain_node.go index c15818a89..ae2841cf4 100644 --- a/chain/cosmos/chain_node.go +++ b/chain/cosmos/chain_node.go @@ -32,12 +32,13 @@ import ( volumetypes "github.com/docker/docker/api/types/volume" dockerclient "github.com/docker/docker/client" "github.com/docker/go-connections/nat" + "go.uber.org/zap" + "golang.org/x/sync/errgroup" + "github.com/strangelove-ventures/interchaintest/v7/ibc" "github.com/strangelove-ventures/interchaintest/v7/internal/blockdb" "github.com/strangelove-ventures/interchaintest/v7/internal/dockerutil" "github.com/strangelove-ventures/interchaintest/v7/testutil" - "go.uber.org/zap" - "golang.org/x/sync/errgroup" ) // ChainNode represents a node in the test network that is being created @@ -1138,6 +1139,24 @@ func (tn *ChainNode) StartContainer(ctx context.Context) error { }, retry.Context(ctx), retry.Attempts(40), retry.Delay(3*time.Second), retry.DelayType(retry.FixedDelay)) } +func (tn *ChainNode) PauseContainer(ctx context.Context) error { + for _, s := range tn.Sidecars { + if err := s.PauseContainer(ctx); err != nil { + return err + } + } + return tn.containerLifecycle.PauseContainer(ctx) +} + +func (tn *ChainNode) UnpauseContainer(ctx context.Context) error { + for _, s := range tn.Sidecars { + if err := s.UnpauseContainer(ctx); err != nil { + return err + } + } + return tn.containerLifecycle.UnpauseContainer(ctx) +} + func (tn *ChainNode) StopContainer(ctx context.Context) error { for _, s := range tn.Sidecars { if err := s.StopContainer(ctx); err != nil { diff --git a/chain/cosmos/sidecar.go b/chain/cosmos/sidecar.go index 7ae7aaf46..c0d044596 100644 --- a/chain/cosmos/sidecar.go +++ b/chain/cosmos/sidecar.go @@ -7,9 +7,10 @@ import ( dockerclient "github.com/docker/docker/client" "github.com/docker/go-connections/nat" + "go.uber.org/zap" + "github.com/strangelove-ventures/interchaintest/v7/ibc" "github.com/strangelove-ventures/interchaintest/v7/internal/dockerutil" - "go.uber.org/zap" ) type SidecarProcesses []*SidecarProcess @@ -110,6 +111,14 @@ func (s *SidecarProcess) StartContainer(ctx context.Context) error { return s.containerLifecycle.StartContainer(ctx) } +func (s *SidecarProcess) PauseContainer(ctx context.Context) error { + return s.containerLifecycle.PauseContainer(ctx) +} + +func (s *SidecarProcess) UnpauseContainer(ctx context.Context) error { + return s.containerLifecycle.UnpauseContainer(ctx) +} + func (s *SidecarProcess) StopContainer(ctx context.Context) error { return s.containerLifecycle.StopContainer(ctx) } diff --git a/ibc/relayer.go b/ibc/relayer.go index 8224332e2..788cab1ac 100644 --- a/ibc/relayer.go +++ b/ibc/relayer.go @@ -64,6 +64,12 @@ type Relayer interface { // StopRelayer stops a relayer that started work through StartRelayer. StopRelayer(ctx context.Context, rep RelayerExecReporter) error + // PauseRelayer halts a relayer that started work through StartRelayer. + PauseRelayer(ctx context.Context) error + + // ResumeRelayer resumes a relayer that was paused through PauseRelayer. + ResumeRelayer(ctx context.Context) error + // Flush flushes any outstanding packets and then returns. Flush(ctx context.Context, rep RelayerExecReporter, pathName string, channelID string) error diff --git a/internal/dockerutil/container_lifecycle.go b/internal/dockerutil/container_lifecycle.go index 834c8ea4f..be7b7f7e3 100644 --- a/internal/dockerutil/container_lifecycle.go +++ b/internal/dockerutil/container_lifecycle.go @@ -12,8 +12,9 @@ import ( dockerclient "github.com/docker/docker/client" "github.com/docker/docker/errdefs" "github.com/docker/go-connections/nat" - "github.com/strangelove-ventures/interchaintest/v7/ibc" "go.uber.org/zap" + + "github.com/strangelove-ventures/interchaintest/v7/ibc" ) type ContainerLifecycle struct { @@ -113,6 +114,14 @@ func (c *ContainerLifecycle) StartContainer(ctx context.Context) error { return nil } +func (c *ContainerLifecycle) PauseContainer(ctx context.Context) error { + return c.client.ContainerPause(ctx, c.id) +} + +func (c *ContainerLifecycle) UnpauseContainer(ctx context.Context) error { + return c.client.ContainerUnpause(ctx, c.id) +} + func (c *ContainerLifecycle) StopContainer(ctx context.Context) error { var timeout container.StopOptions timeoutSec := 30 diff --git a/relayer/docker.go b/relayer/docker.go index 72c81224d..052b99140 100644 --- a/relayer/docker.go +++ b/relayer/docker.go @@ -13,10 +13,11 @@ import ( volumetypes "github.com/docker/docker/api/types/volume" "github.com/docker/docker/client" "github.com/docker/docker/pkg/stdcopy" + "go.uber.org/zap" + "github.com/strangelove-ventures/interchaintest/v7/ibc" "github.com/strangelove-ventures/interchaintest/v7/internal/dockerutil" "github.com/strangelove-ventures/interchaintest/v7/testutil" - "go.uber.org/zap" ) const ( @@ -445,6 +446,20 @@ func (r *DockerRelayer) StopRelayer(ctx context.Context, rep ibc.RelayerExecRepo return nil } +func (r *DockerRelayer) PauseRelayer(ctx context.Context) error { + if r.containerLifecycle == nil { + return fmt.Errorf("container not running") + } + return r.client.ContainerPause(ctx, r.containerLifecycle.ContainerID()) +} + +func (r *DockerRelayer) ResumeRelayer(ctx context.Context) error { + if r.containerLifecycle == nil { + return fmt.Errorf("container not running") + } + return r.client.ContainerUnpause(ctx, r.containerLifecycle.ContainerID()) +} + func (r *DockerRelayer) containerImage() ibc.DockerImage { if r.customImage != nil { return *r.customImage