/**
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.aurora.scheduler.http;
import java.util.Map;
import java.util.Set;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.core.HttpHeaders;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.ClientResponse.Status;
import org.apache.aurora.gen.AssignedTask;
import org.apache.aurora.gen.ScheduleStatus;
import org.apache.aurora.gen.ScheduledTask;
import org.apache.aurora.scheduler.base.JobKeys;
import org.apache.aurora.scheduler.base.Query;
import org.apache.aurora.scheduler.storage.entities.IAssignedTask;
import org.apache.aurora.scheduler.storage.entities.IScheduledTask;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class MnameTest extends AbstractJettyTest {
private static final String SLAVE_HOST = "fakehost";
private static final int PORT = 50000;
private static final String APP_URI = "http://" + SLAVE_HOST + ":" + PORT + "/";
private static final IScheduledTask TASK = IScheduledTask.build(
new ScheduledTask()
.setStatus(ScheduleStatus.RUNNING)
.setAssignedTask(
new AssignedTask()
.setSlaveHost("fakehost")
.setAssignedPorts(ImmutableMap.of("http", 50000))));
private static final Query.Builder TASK_QUERY =
Query.instanceScoped(JobKeys.from("myrole", "test", "myjob"), 1).active();
@Test
public void testGetUsage() {
replayAndStart();
ClientResponse response = getRequestBuilder("/mname")
.get(ClientResponse.class);
assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
}
@Test
public void testHttpMethods() {
storage.expectOperations();
Set<String> methods =
ImmutableSet.of(HttpMethod.GET, HttpMethod.PUT, HttpMethod.POST, HttpMethod.DELETE);
storage.expectTaskFetch(TASK_QUERY, TASK).times(methods.size());
replayAndStart();
for (String method : methods) {
ClientResponse response = getRequestBuilder("/mname/myrole/test/myjob/1")
.method(method, ClientResponse.class);
assertEquals(Status.TEMPORARY_REDIRECT.getStatusCode(), response.getStatus());
assertEquals(APP_URI, response.getHeaders().getFirst(HttpHeaders.LOCATION));
}
}
@Test
public void testForwardPathAndQuery() {
storage.expectOperations();
Set<String> methods =
ImmutableSet.of(HttpMethod.GET, HttpMethod.PUT, HttpMethod.POST, HttpMethod.DELETE);
storage.expectTaskFetch(TASK_QUERY, TASK).times(methods.size());
replayAndStart();
String pathAndQuery = "path?query=2";
for (String method : methods) {
ClientResponse response = getRequestBuilder("/mname/myrole/test/myjob/1/" + pathAndQuery)
.method(method, ClientResponse.class);
assertEquals(Status.TEMPORARY_REDIRECT.getStatusCode(), response.getStatus());
assertEquals(APP_URI + pathAndQuery, response.getHeaders().getFirst(HttpHeaders.LOCATION));
}
}
@Test
public void testInstanceAbsent() {
storage.expectOperations();
storage.expectTaskFetch(TASK_QUERY);
replayAndStart();
ClientResponse response = getRequestBuilder("/mname/myrole/test/myjob/1")
.get(ClientResponse.class);
assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
}
@Test
public void testInstanceNotRunning() {
storage.expectOperations();
IScheduledTask pending =
IScheduledTask.build(TASK.newBuilder().setStatus(ScheduleStatus.PENDING));
storage.expectTaskFetch(TASK_QUERY, pending);
replayAndStart();
ClientResponse response = getRequestBuilder("/mname/myrole/test/myjob/1")
.get(ClientResponse.class);
assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
}
@Test
public void testInstanceNoHttp() {
storage.expectOperations();
ScheduledTask builder = TASK.newBuilder();
builder.getAssignedTask().setAssignedPorts(ImmutableMap.of("telnet", 80));
IScheduledTask noHttp = IScheduledTask.build(builder);
storage.expectTaskFetch(TASK_QUERY, noHttp);
replayAndStart();
ClientResponse response = getRequestBuilder("/mname/myrole/test/myjob/1")
.get(ClientResponse.class);
assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
}
@Test
public void testRedirectPort() {
replayAndStart();
assertEquals(Optional.absent(), getRedirectPort(null));
assertEquals(Optional.absent(), getRedirectPort(ImmutableMap.of()));
assertEquals(Optional.absent(), getRedirectPort(ImmutableMap.of("thrift", 5)));
assertEquals(Optional.of(5), getRedirectPort(ImmutableMap.of("health", 5, "http", 6)));
assertEquals(Optional.of(6), getRedirectPort(ImmutableMap.of("http", 6)));
assertEquals(Optional.of(7), getRedirectPort(ImmutableMap.of("HTTP", 7)));
assertEquals(Optional.of(8), getRedirectPort(ImmutableMap.of("web", 8)));
assertEquals(Optional.of(9), getRedirectPort(ImmutableMap.of("admin", 9)));
}
private Optional<Integer> getRedirectPort(Map<String, Integer> ports) {
return Mname.getRedirectPort(IAssignedTask.build(new AssignedTask().setAssignedPorts(ports)));
}
}