@Test public void testPutMethodWithFileBodyGenerator() throws Exception { byte[] contents = "hello world".getBytes(UTF_8); File testFile = File.createTempFile("test", null); Files.write(testFile.toPath(), contents); URI uri = baseURI.resolve("/road/to/nowhere"); Request request = preparePut() .setUri(uri) .addHeader(CONTENT_TYPE, "x-test") .setBodyGenerator(new FileBodyGenerator(testFile.toPath())) .build(); int statusCode = executeRequest(request, createStatusResponseHandler()).getStatusCode(); assertEquals(statusCode, 200); assertEquals(servlet.getRequestMethod(), "PUT"); assertEquals(servlet.getRequestUri(), uri); assertEquals(servlet.getRequestHeaders(CONTENT_TYPE), ImmutableList.of("x-test")); assertEquals(servlet.getRequestHeaders(CONTENT_LENGTH), ImmutableList.of(String.valueOf(contents.length))); assertEquals(servlet.getRequestBytes(), contents); assertTrue(testFile.delete()); }
@Test public void testPutMethod() throws Exception { URI uri = baseURI.resolve("/road/to/nowhere"); Request request = preparePut() .setUri(uri) .addHeader("foo", "bar") .addHeader("dupe", "first") .addHeader("dupe", "second") .build(); int statusCode = executeRequest(request, createStatusResponseHandler()).getStatusCode(); assertEquals(statusCode, 200); assertEquals(servlet.getRequestMethod(), "PUT"); assertEquals(servlet.getRequestUri(), uri); assertEquals(servlet.getRequestHeaders("foo"), ImmutableList.of("bar")); assertEquals(servlet.getRequestHeaders("dupe"), ImmutableList.of("first", "second")); assertEquals(servlet.getRequestHeaders("x-custom-filter"), ImmutableList.of("custom value")); }
@Test public void testPutMethod() throws Exception { URI uri = baseURI.resolve("/road/to/nowhere"); Request request = preparePut() .setUri(uri) .addHeader("foo", "bar") .addHeader("dupe", "first") .addHeader("dupe", "second") .build(); int statusCode = executeRequest(request, createStatusResponseHandler()).getStatusCode(); assertEquals(statusCode, 200); assertEquals(servlet.getRequestMethod(), "PUT"); assertEquals(servlet.getRequestUri(), uri); assertEquals(servlet.getRequestHeaders("foo"), ImmutableList.of("bar")); assertEquals(servlet.getRequestHeaders("dupe"), ImmutableList.of("first", "second")); assertEquals(servlet.getRequestHeaders("x-custom-filter"), ImmutableList.of("custom value")); }
@Override public SlotStatus restart() { try { Request request = Request.Builder.preparePut() .setUri(uriBuilderFrom(slotStatus.getSelf()).appendPath("lifecycle").build()) .setHeader(AIRSHIP_AGENT_VERSION_HEADER, agent.status().getVersion()) .setHeader(AIRSHIP_SLOT_VERSION_HEADER, slotStatus.getVersion()) .setBodyGenerator(createStaticBodyGenerator("restarting", UTF_8)) .build(); SlotStatusRepresentation slotStatusRepresentation = httpClient.execute(request, createJsonResponseHandler(slotStatusCodec, Status.OK.getStatusCode())); updateStatus(slotStatusRepresentation.toSlotStatus(slotStatus.getInstanceId())); return slotStatus; } catch (Exception e) { log.error(e); return setErrorStatus(e.getMessage()); } }
@Test public void testRestart() throws Exception { initializeOneAgent(); Request request = Request.Builder.preparePut() .setUri(coordinatorUriBuilder().appendPath("/v1/slot/lifecycle").addParameter("binary", "apple:*").build()) .setBodyGenerator(createStaticBodyGenerator("restarting", UTF_8)) .build(); List<SlotStatusRepresentation> actual = httpClient.execute(request, createJsonResponseHandler(slotStatusesCodec, Status.OK.getStatusCode())); AgentStatus agentStatus = coordinator.getAgentByAgentId(agentId); SlotStatus apple1Status = agentStatus.getSlotStatus(apple1SotId); SlotStatus apple2Status = agentStatus.getSlotStatus(apple2SlotId); SlotStatus bananaStatus = agentStatus.getSlotStatus(bananaSlotId); List<SlotStatusRepresentation> expected = ImmutableList.of( slotStatusRepresentationFactory.create(apple1Status), slotStatusRepresentationFactory.create(apple2Status)); assertEqualsNoOrder(actual, expected); assertEquals(apple1Status.getState(), RUNNING); assertEquals(apple2Status.getState(), RUNNING); assertEquals(bananaStatus.getState(), STOPPED); }
@Test public void testStart() throws Exception { initializeOneAgent(); Request request = Request.Builder.preparePut() .setUri(coordinatorUriBuilder().appendPath("/v1/slot/lifecycle").addParameter("binary", "*:apple:*").build()) .setBodyGenerator(createStaticBodyGenerator("running", UTF_8)) .build(); List<SlotStatusRepresentation> actual = httpClient.execute(request, createJsonResponseHandler(slotStatusesCodec, Status.OK.getStatusCode())); List<SlotStatusRepresentation> expected = ImmutableList.of( slotStatusRepresentationFactory.create(appleSlot1.status().changeInstanceId(agentInstanceId)), slotStatusRepresentationFactory.create(appleSlot2.status().changeInstanceId(agentInstanceId))); assertEquals(appleSlot1.status().getState(), RUNNING); assertEquals(appleSlot2.status().getState(), RUNNING); assertEquals(bananaSlot.status().getState(), STOPPED); assertEqualsNoOrder(actual, expected); }
@Test public void testPutMethod() throws Exception { URI uri = baseURI.resolve("/road/to/nowhere"); Request request = preparePut() .setUri(uri) .addHeader("foo", "bar") .addHeader("dupe", "first") .addHeader("dupe", "second") .build(); int statusCode = executeRequest(request, createStatusResponseHandler()).getStatusCode(); assertEquals(statusCode, 200); assertEquals(servlet.getRequestMethod(), "PUT"); assertEquals(servlet.getRequestUri(), uri); assertEquals(servlet.getRequestHeaders("foo"), ImmutableList.of("bar")); assertEquals(servlet.getRequestHeaders("dupe"), ImmutableList.of("first", "second")); assertEquals(servlet.getRequestHeaders("x-custom-filter"), ImmutableList.of("custom value")); }
@Override public void backupShard(UUID uuid, File source) { Request request = preparePut() .addHeader(PRESTO_ENVIRONMENT, environment) .addHeader(CONTENT_TYPE, APPLICATION_BINARY.toString()) .addHeader(CONTENT_XXH64, format("%016x", xxHash64(source))) .setUri(shardUri(uuid)) .setBodyGenerator(new FileBodyGenerator(source)) .build(); try { StatusResponse status = httpClient.execute(request, createStatusResponseHandler()); if (!isOk(status)) { throw badResponse(status); } } catch (RuntimeException e) { throw new PrestoException(RAPTOR_BACKUP_ERROR, "Failed to backup shard: " + uuid, e); } }
@Test public void testStart() throws Exception { initializeOneAgent(); Request request = Request.Builder.preparePut() .setUri(coordinatorUriBuilder().appendPath("/v1/slot/lifecycle").addParameter("binary", "apple:*").build()) .setBodyGenerator(createStaticBodyGenerator("running", UTF_8)) .build(); List<SlotStatusRepresentation> actual = httpClient.execute(request, createJsonResponseHandler(slotStatusesCodec, Status.OK.getStatusCode())); AgentStatus agentStatus = coordinator.getAgentByAgentId(agentId); SlotStatus apple1Status = agentStatus.getSlotStatus(apple1SotId); SlotStatus apple2Status = agentStatus.getSlotStatus(apple2SlotId); SlotStatus bananaStatus = agentStatus.getSlotStatus(bananaSlotId); List<SlotStatusRepresentation> expected = ImmutableList.of( slotStatusRepresentationFactory.create(apple1Status), slotStatusRepresentationFactory.create(apple2Status)); assertEqualsNoOrder(actual, expected); assertEquals(apple1Status.getState(), RUNNING); assertEquals(apple2Status.getState(), RUNNING); assertEquals(bananaStatus.getState(), STOPPED); }
@Override public SlotStatus kill() { try { Request request = Request.Builder.preparePut() .setUri(uriBuilderFrom(slotStatus.getSelf()).appendPath("lifecycle").build()) .setBodyGenerator(createStaticBodyGenerator("killing", UTF_8)) .build(); SlotStatusRepresentation slotStatusRepresentation = httpClient.execute(request, createJsonResponseHandler(slotStatusCodec, Status.OK.getStatusCode())); updateStatus(slotStatusRepresentation.toSlotStatus(slotStatus.getInstanceId())); return slotStatus; } catch (Exception e) { log.error(e); return setErrorStatus(e.getMessage()); } } }
@Override public void backupShard(UUID uuid, File source) { Request request = preparePut() .addHeader(PRESTO_ENVIRONMENT, environment) .addHeader(CONTENT_TYPE, APPLICATION_BINARY.toString()) .addHeader(CONTENT_XXH64, format("%016x", xxHash64(source))) .setUri(shardUri(uuid)) .setBodyGenerator(new FileBodyGenerator(source)) .build(); try { StatusResponse status = httpClient.execute(request, createStatusResponseHandler()); if (!isOk(status)) { throw badResponse(status); } } catch (RuntimeException e) { throw new PrestoException(RAPTOR_BACKUP_ERROR, "Failed to backup shard: " + uuid, e); } }
@Override public SlotStatus start() { try { Request request = Request.Builder.preparePut() .setUri(uriBuilderFrom(slotStatus.getSelf()).appendPath("lifecycle").build()) .setHeader(AIRSHIP_AGENT_VERSION_HEADER, agent.status().getVersion()) .setHeader(AIRSHIP_SLOT_VERSION_HEADER, slotStatus.getVersion()) .setBodyGenerator(createStaticBodyGenerator("running", UTF_8)) .build(); SlotStatusRepresentation slotStatusRepresentation = httpClient.execute(request, createJsonResponseHandler(slotStatusCodec, Status.OK.getStatusCode())); updateStatus(slotStatusRepresentation.toSlotStatus(slotStatus.getInstanceId())); return slotStatus; } catch (Exception e) { log.error(e); return setErrorStatus(e.getMessage()); } }
@Test public void testPut() throws IOException, ExecutionException, InterruptedException { String json = Resources.toString(Resources.getResource("single.json"), UTF_8); StatusResponse response = client.execute( preparePut() .setUri(uriFor("/v1/person/foo")) .addHeader(CONTENT_TYPE, APPLICATION_JSON) .setBodyGenerator(createStaticBodyGenerator(json, UTF_8)) .build(), createStatusResponseHandler()); assertEquals(response.getStatusCode(), javax.ws.rs.core.Response.Status.CREATED.getStatusCode()); assertEquals(store.get("foo"), new Person("foo@example.com", "Mr Foo")); assertEquals(eventClient.getEvents(), ImmutableList.of( personAdded("foo", new Person("foo@example.com", "Mr Foo")))); }
@Test public void testLifecycleUnknown() throws Exception { initializeOneAgent(); Request request = Request.Builder.preparePut() .setUri(coordinatorUriBuilder().appendPath("/v1/slot/lifecycle").addParameter("binary", "apple:*").build()) .setBodyGenerator(createStaticBodyGenerator("unknown", UTF_8)) .build(); StatusResponse response = httpClient.execute(request, createStatusResponseHandler()); AgentStatus agentStatus = coordinator.getAgentByAgentId(agentId); SlotStatus apple1Status = agentStatus.getSlotStatus(apple1SotId); SlotStatus apple2Status = agentStatus.getSlotStatus(apple2SlotId); SlotStatus bananaStatus = agentStatus.getSlotStatus(bananaSlotId); assertEquals(response.getStatusCode(), Status.BAD_REQUEST.getStatusCode()); assertEquals(apple1Status.getState(), STOPPED); assertEquals(apple2Status.getState(), STOPPED); assertEquals(bananaStatus.getState(), STOPPED); }
@Test public void testPutNotAllowed() throws Exception { String json = Resources.toString(Resources.getResource("slot-status.json"), UTF_8); Request request = Request.Builder.preparePut() .setUri(urlFor("/v1/agent/slot")) .setHeader(CONTENT_TYPE, MediaType.APPLICATION_JSON) .setBodyGenerator(createStaticBodyGenerator(json, UTF_8)) .build(); StatusResponse response = client.execute(request, createStatusResponseHandler()); assertEquals(response.getStatusCode(), NOT_ALLOWED); assertNull(agent.getSlot(UUID.randomUUID())); }
@Test public void testPutNotAllowed() throws Exception { String json = Resources.toString(Resources.getResource("slot-status.json"), UTF_8); Request request = Request.Builder.preparePut() .setUri(urlFor("/v1/agent/slot")) .setHeader(CONTENT_TYPE, MediaType.APPLICATION_JSON) .setBodyGenerator(createStaticBodyGenerator(json, UTF_8)) .build(); StatusResponse response = client.execute(request, createStatusResponseHandler()); assertEquals(response.getStatusCode(), NOT_ALLOWED); assertNull(agent.getSlot(UUID.randomUUID())); }
@Override public List<SlotStatusRepresentation> setState(SlotFilter slotFilter, SlotLifecycleState state, String expectedVersion) { URI uri = slotFilter.toUri(uriBuilderFrom(coordinatorUri).replacePath("/v1/slot/lifecycle")); Request.Builder requestBuilder = Request.Builder.preparePut() .setUri(uri) .setBodyGenerator(textBodyGenerator(state.name())); if (expectedVersion != null) { requestBuilder.setHeader(AIRSHIP_SLOTS_VERSION_HEADER, expectedVersion); } List<SlotStatusRepresentation> slots = client.execute(requestBuilder.build(), createJsonResponseHandler(SLOTS_CODEC)); return slots; }
@Override public List<SlotStatusRepresentation> setState(SlotFilter slotFilter, SlotLifecycleState state, String expectedVersion) { URI uri = slotFilter.toUri(uriBuilderFrom(coordinatorUri).replacePath("/v1/slot/lifecycle")); Request.Builder requestBuilder = Request.Builder.preparePut() .setUri(uri) .setBodyGenerator(textBodyGenerator(state.name())); if (expectedVersion != null) { requestBuilder.setHeader(AIRSHIP_SLOTS_VERSION_HEADER, expectedVersion); } List<SlotStatusRepresentation> slots = client.execute(requestBuilder.build(), createJsonResponseHandler(SLOTS_CODEC)); return slots; }
@Test public void testLifecycleUnknown() throws Exception { SlotStatus slotStatus = agent.install(appleInstallation); Request request = Request.Builder.preparePut() .setUri(urlFor(slotStatus, "lifecycle")) .setBodyGenerator(createStaticBodyGenerator("unknown", UTF_8)) .build(); StatusResponse response = client.execute(request, createStatusResponseHandler()); assertEquals(response.getStatusCode(), Status.BAD_REQUEST.getStatusCode()); }
@Test public void testLifecycleUnknown() throws Exception { SlotStatus slotStatus = agent.install(appleInstallation); Request request = Request.Builder.preparePut() .setUri(urlFor(slotStatus, "lifecycle")) .setBodyGenerator(createStaticBodyGenerator("unknown", UTF_8)) .build(); StatusResponse response = client.execute(request, createStatusResponseHandler()); assertEquals(response.getStatusCode(), Status.BAD_REQUEST.getStatusCode()); }