502 при запуске теста SQS с использованием локального стека
Я пытаюсь запустить некоторые тесты с SQS, используя localstack. Тем не менее, я продолжаю получать 502. Это работает для коллег, но это не работает на моей локальной машине, на нашем конвейере или на докере. Ошибка везде одинаковая, поэтому я отправляю версию докера, так как, вероятно, проще показать, что установлено.
В основном я создаю образ докера, который устанавливает java, python и выполняет сборку gradle из папки / repo, выполняя интеграционные тесты.
FROM openjdk:11.0.2-jdk-oraclelinux7
RUN ["yum", "install", "-y", "python", "python-pip"]
RUN ["pip", "install", "--upgrade", "pip"]
RUN ["pip", "install", "virtualenv"]
VOLUME ["/repo"]
ARG sourceDir
COPY ["${sourceDir}", "/repo"]
WORKDIR "/repo"
ENTRYPOINT ["/repo/gradlew", "clean", "integrationTest"]
Мой тестовый код выглядит так:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(LocalstackTestRunner.class)
public class TimeoutQueueTest {
private AmazonSQS client;
private static final String QUEUE_NAME = "my queue";
@LocalServerPort
private int port;
@ClassRule
public static final SpringClassRule springClassRule = new SpringClassRule();
@Rule
public final SpringMethodRule springMethodRule = new SpringMethodRule();
@Before
public void setup() {
Map<String, String> attributeMap = new HashMap<>();
attributeMap.put("DelaySeconds", "0");
attributeMap.put("MaximumMessageSize", "262144");
attributeMap.put("MessageRetentionPeriod", "1209600");
attributeMap.put("ReceiveMessageWaitTimeSeconds", "20");
attributeMap.put("VisibilityTimeout", "30");
client = TestUtils.getClientSQS();
CreateQueueRequest createQueueRequest = new CreateQueueRequest(QUEUE_NAME).withAttributes(attributeMap);
//FAILS IN THE LINE BELOW!!!!!!!!!!!!!!!!!!
String standardQueueUrl = client.createQueue(createQueueRequest).getQueueUrl();
RestAssured.port = port;
}
(...)
}
Это терпит неудачу с:
com.amazonaws.services.sqs.model.AmazonSQSException: null (Сервис: AmazonSQS; Код состояния: 502; Код ошибки: 502 Bad Gateway; Идентификатор запроса: null)
по адресу com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1660) по адресу com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.Exp.Hecent.Hept.HecTexText) (AmazonHttpClient.java:1074) по адресу com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:745) по адресу com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithttawli.Hame.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:701) по адресу com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:669) по адресу com.amazonaws.http.AlibExIxIutHext:651) по адресу com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:515) по адресу com.amazonaws.services.sqs.AmazonSQSClient.doInvoke(AmazonSQSClient.java:2147) по адресу com.zonaws.servicesSqlima. вызывать (AmazonSQSClient.java:2116) на com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:2105) на com.amazonaws.services.sqs.AmazonSQSClient.executeCreateQueue(AmazonSQSClient.java:756) на comama. " в java.base/jdk.internal.reflect..reflect.Method.invoke(Method.java:566) в org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) в org.junit.internal.runners.model.ReflectiveCallable.un Java:12) в org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) в org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) по адресу org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) в org.springithoto.ta.te.tetete оценивать (RunAfterTestMethodCallbacks.java:86) по адресу org.springframework.test.context.junit4.statements.RunPrepareTestInstanceCallbacks.evaluate(RunPrepareTestInstanceCallbacks.java:64) по адресу org.springframework.ateat.Retestatete Java:84) в org.springframework.test.context.junit4.statements.SpringFailOnTimeout.evaluate(SpringFailOnTimeout.java:87) в org.springframework.test.context.junit4.statements.ProfileValueChecker.10ue (10). на com.github.tomakehurst.wiremock.junit.WireMockRule$1.evaluate(WireMockRule.java:73) на org.junit.rules.RunRules.evaluate(RunRules.java:20) на org.junit.runners.ParentRunner.un ParentRunner.java:325) в org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) в org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) в org.junit.runners.ParentRunava.runners.ParentRunner$1.schedule(ParentRunner.java:71) в org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) в org.junit.runners.ParentRunner.access$000(ParentRunner.java:58).junit.runners.ParentRunner$2 высказывания.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) в org.springframework.test.context.junit4.statements.ProfileValueChecker.evaluate(ProfileValueChecker.java:103) в org.springun.tr. TestContextManagerCacheEvictor.evaluate(SpringClassRule.java:190) в org.junit.rules.RunRules.evaluate(RunRules.java:20) в org.junit.runners.ParentRunner.run(ParentRunner.java:363) в cloud.localstack.LocalstackTestRunner.run(LocalstackTestRunner.java:25) в org.junit.nun.Uore.runner. выполнить (JUnitCore.java:137) в com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) в com.intellij.rt.execution.junit.IdeaTestRawartRunner.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) в com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Есть идеи? Что мне не хватает? Код, кажется, работает, так как он работает для моего коллеги (видел это своими глазами). Он не помнит, чтобы что-то отличалось от меня с точки зрения настройки.
Мы оба используем Python 2.7.10, кстати (если это имеет значение).
0 ответов
Скорее всего, это происходит из-за того, что ваш контейнер еще не готов к моменту запуска тестов. Вы можете дождаться проверки работоспособности или какого-нибудь http-пути, что-то вроде:
@ClassRule
public static final LocalStackContainer localstack = new LocalStackContainer().withServices(SQS);
@Before
public void before(){
localstack.waitingFor(Wait.forHealthcheck()); //or Wait.forHttp("/")
}
Старайтесь не делать предположений о том, что сервисы AWS всегда исправны. В бэкэнде сервисов AWS у них также есть контейнеры, где их контейнеры могут быть остановлены, повернуты, перезапущены, и все их сервисы поддержки контейнеров также могут быть отключены, повернуты или перезапущены. В этом случае вам понадобится проверка работоспособности, чтобы убедиться, что sqs готов к отправке или прослушиванию. Поток ниже может указать вам, как правильно слушать с проверкой работоспособности: