使用测试容器模拟数据库的网络中断

时间:2019-01-09 23:16:18

标签: java testcontainers

我正在尝试使用测试容器模拟网络中断。 我想使用Socat容器暴露端口,然后将其击落,然后再向上击。我无法处理,因为没有停止。

我该如何管理?

2 个答案:

答案 0 :(得分:2)

那很容易!

您需要2个容器,SocatContainer(由Testcontainers提供)和您的目标容器。将它们(Socat和目标)连接到网络,请参见此处的示例:
https://github.com/testcontainers/testcontainers-java/blob/bcecd5cd9f9325517fd45db585312df2624315bb/core/src/test/java/org/testcontainers/containers/NetworkTest.java

当您需要模拟中断时,只需将目标与网络断开连接(通过使用通过DockerClientFactory.instance().client()disconnectFromNetworkCmd获得的Docker客户端)。

确认中断已得到正确处理后,使用connectToNetworkCmd将目标连接到网络。

另一种解决方案是使用Shopify的Toxiproxy:
https://github.com/shopify/toxiproxy。 在一个容器中启动它(当然是使用Testcontainers),然后使用其Java客户端应用混乱操作。

答案 1 :(得分:0)

最简单的方法是通过testcontainers对toxiproxy(https://www.testcontainers.org/modules/toxiproxy/)的支持。

从上述网页复制粘贴:

E.g. // Create a common docker network so that containers can communicate
@Rule
public Network network = Network.newNetwork();

// the target container - this could be anything
@Rule
public GenericContainer redis = new GenericContainer("redis:5.0.4")
    .withExposedPorts(6379)
    .withNetwork(network);

// Toxiproxy container, which will be used as a TCP proxy
@Rule
public ToxiproxyContainer toxiproxy = new ToxiproxyContainer()
    .withNetwork(network);
// To simulate an outage you do:

final ToxiproxyContainer.ContainerProxy proxy = toxiproxy.getProxy(redis, 6379);
proxy.setConnectionCut(true);