@Test public void testGetClusterNotOwnedByUserReturns404() throws Exception { ClusterCreateRequest clusterCreateRequest = ClusterCreateRequest.builder() .setName("cluster1") .setClusterTemplateName(reactorTemplate.getName()) .setNumMachines(5) .build(); HttpResponse response = doPostExternalAPI("/clusters", gson.toJson(clusterCreateRequest), USER1_HEADERS); assertResponseStatus(response, HttpResponseStatus.OK); String clusterId = getIdFromResponse(response); assertResponseStatus(doGetExternalAPI("/clusters/" + clusterId, USER2_HEADERS), HttpResponseStatus.NOT_FOUND); }
protected static void assertStatusWithUser1(String clusterId, Cluster.Status status, ClusterJob.Status actionStatus, ClusterAction action, int totalSteps, int completeSteps) throws Exception { // by default uses user1 assertStatus(clusterId, status, actionStatus, action, totalSteps, completeSteps, USER1_HEADERS); }
.setNumMachines(2) .build(); HttpResponse response = doPostExternalAPI("/clusters", gson.toJson(clusterCreateRequest), USER1_HEADERS); assertResponseStatus(response, HttpResponseStatus.OK); String clusterId = getIdFromResponse(response); assertStatusWithUser1(clusterId, Cluster.Status.PENDING, ClusterJob.Status.NOT_SUBMITTED, ClusterAction.SOLVE_LAYOUT, 0, 0); assertStatusWithUser1(clusterId, Cluster.Status.TERMINATED, ClusterJob.Status.FAILED, ClusterAction.SOLVE_LAYOUT, 0, 0); assertStatusWithUser1(clusterId, Cluster.Status.TERMINATED, ClusterJob.Status.FAILED, ClusterAction.SOLVE_LAYOUT, 0, 0); response = doDeleteExternalAPI("/clusters/" + clusterId, USER1_HEADERS); assertResponseStatus(response, HttpResponseStatus.OK); assertStatusWithUser1(clusterId, Cluster.Status.TERMINATED, ClusterJob.Status.FAILED, ClusterAction.SOLVE_LAYOUT, 0, 0); assertStatusWithUser1(clusterId, Cluster.Status.TERMINATED, ClusterJob.Status.FAILED, ClusterAction.SOLVE_LAYOUT, 0, 0);
@Test public void testGetNonexistantClusterReturns404() throws Exception { assertResponseStatus(doGetExternalAPI("/clusters/567", USER1_HEADERS), HttpResponseStatus.NOT_FOUND); }
@Test public void testDeleteOnClusterNotOwnedByUserReturns404() throws Exception { ClusterCreateRequest clusterCreateRequest = ClusterCreateRequest.builder() .setName("cluster1") .setClusterTemplateName(reactorTemplate.getName()) .setNumMachines(5) .build(); HttpResponse response = doPostExternalAPI("/clusters", gson.toJson(clusterCreateRequest), USER1_HEADERS); assertResponseStatus(response, HttpResponseStatus.OK); String clusterId = getIdFromResponse(response); assertResponseStatus(doDeleteExternalAPI("/clusters/" + clusterId, USER2_HEADERS), HttpResponseStatus.NOT_FOUND); }
@Test public void testServiceActionsOnNonexistantClusterServiceReturn404() throws Exception { Cluster cluster = Cluster.builder() .setID("123") .setAccount(USER1_ACCOUNT) .setName("test-cluster") .setClusterTemplate(Entities.ClusterTemplateExample.HDFS) .setStatus(Cluster.Status.ACTIVE) .build(); clusterStoreService.getView(cluster.getAccount()).writeCluster(cluster); assertResponseStatus(doPostExternalAPI("/clusters/123/services/fake/stop", "", USER1_HEADERS), HttpResponseStatus.NOT_FOUND); assertResponseStatus(doPostExternalAPI("/clusters/123/services/fake/start", "", USER1_HEADERS), HttpResponseStatus.NOT_FOUND); assertResponseStatus(doPostExternalAPI("/clusters/123/services/fake/restart", "", USER1_HEADERS), HttpResponseStatus.NOT_FOUND); }
clusterStore.writeNode(node2); HttpResponse response = doDeleteExternalAPI("/clusters/" + clusterId, USER1_HEADERS); assertResponseStatus(response, HttpResponseStatus.OK); assertStatusWithUser1(clusterId, Cluster.Status.PENDING, ClusterJob.Status.RUNNING, ClusterAction.CLUSTER_DELETE, 2, 0); SchedulableTask task = TestHelper.takeTask(getBaseUrlInternalAPI(), takeRequest); verifyNode(task.getNodeId(), ImmutableList.of("DELETE"), ImmutableList.of(Node.Status.IN_PROGRESS.name())); new FinishTaskRequest("workerX", PROVISIONER_ID, tenantId, task.getTaskId(), null, null, 0, null, null, null); TestHelper.finishTask(getBaseUrlInternalAPI(), finishRequest); assertResponseStatus(response, HttpResponseStatus.OK); verifyNode(task.getNodeId(), ImmutableList.of("DELETE"), ImmutableList.of(Node.Status.COMPLETE.name())); assertStatusWithUser1(clusterId, Cluster.Status.TERMINATED, ClusterJob.Status.COMPLETE, ClusterAction.CLUSTER_DELETE, 2, 2); response = doGetExternalAPI(String.format("/clusters/%s/status","567"), USER1_HEADERS); assertResponseStatus(response, HttpResponseStatus.NOT_FOUND);
@Test public void testAddCluster() throws Exception { String clusterName = "my-cluster"; String tenantId = USER1_ACCOUNT.getTenantId(); ClusterCreateRequest clusterCreateRequest = ClusterCreateRequest.builder() .setName(clusterName) .setClusterTemplateName(reactorTemplate.getName()) .setNumMachines(5) .build(); HttpResponse response = doPostExternalAPI("/clusters", gson.toJson(clusterCreateRequest), USER1_HEADERS); assertResponseStatus(response, HttpResponseStatus.OK); String clusterId = getIdFromResponse(response); // check there was an element added to the cluster queue for creating this cluster Element element = solverQueues.take(tenantId, "0"); Assert.assertEquals(clusterId, element.getId()); ClusterCreateRequest expected = ClusterCreateRequest.builder() .setName(clusterName) .setClusterTemplateName(reactorTemplate.getName()) .setNumMachines(5) .setInitialLeaseDuration(-1L) .build(); SolverRequest expectedSolverRequest = new SolverRequest(SolverRequest.Type.CREATE_CLUSTER, gson.toJson(expected)); Assert.assertEquals(expectedSolverRequest, gson.fromJson(element.getValue(), SolverRequest.class)); }
@Test public void testPutClusterConfig() throws Exception { JsonObject originalConfig = new JsonObject(); originalConfig.addProperty("key1", "val1"); Cluster cluster = Cluster.builder() .setID("123") .setAccount(USER1_ACCOUNT) .setName("get-config-test") .setProvider(Entities.ProviderExample.JOYENT) .setClusterTemplate(Entities.ClusterTemplateExample.HDFS) .setConfig(originalConfig) .build(); cluster.setStatus(Cluster.Status.ACTIVE); clusterStoreService.getView(cluster.getAccount()).writeCluster(cluster); HttpResponse response = doGetExternalAPI("/clusters/123/config", USER1_HEADERS); assertResponseStatus(response, HttpResponseStatus.OK); Reader reader = new InputStreamReader(response.getEntity().getContent(), Charsets.UTF_8); JsonObject actual = gson.fromJson(reader, JsonObject.class); Assert.assertEquals(originalConfig, actual); JsonObject newConfig = new JsonObject(); newConfig.addProperty("key2", "val2"); ClusterConfigureRequest configRequest = new ClusterConfigureRequest(null, newConfig, false); assertResponseStatus(doPutExternalAPI("/clusters/123/config", gson.toJson(configRequest), USER1_HEADERS), HttpResponseStatus.OK); response = doGetExternalAPI("/clusters/123/config", USER1_HEADERS); assertResponseStatus(response, HttpResponseStatus.OK); reader = new InputStreamReader(response.getEntity().getContent(), Charsets.UTF_8); actual = gson.fromJson(reader, JsonObject.class); Assert.assertEquals(newConfig, actual); }
.setNumMachines(5) .build(); HttpResponse response = doPostExternalAPI("/clusters", gson.toJson(clusterCreateRequest), USER1_HEADERS); assertResponseStatus(response, HttpResponseStatus.OK); .setNumMachines(6) .build(); response = doPostExternalAPI("/clusters", gson.toJson(clusterCreateRequest), USER1_HEADERS); assertResponseStatus(response, HttpResponseStatus.OK); response = doGetExternalAPI("/clusters", USER1_HEADERS); assertResponseStatus(response, HttpResponseStatus.OK); InputStreamReader reader = new InputStreamReader(response.getEntity().getContent(), Charsets.UTF_8); List<ClusterSummary> clusterInfos = gson.fromJson(reader, new TypeToken<List<ClusterSummary>>() {}.getType());
@Test public void testInvalidClusterConfigRequests() throws Exception { Cluster cluster = Cluster.builder() .setID("123") .setAccount(USER1_ACCOUNT) .setName("get-config-test") .setClusterTemplate(Entities.ClusterTemplateExample.HDFS) .build(); clusterStoreService.getView(cluster.getAccount()).writeCluster(cluster); String requestStr = gson.toJson(new ClusterConfigureRequest(null, new JsonObject(), false)); assertResponseStatus(doPutExternalAPI("/clusters/" + cluster.getId() + "/config", "{}", USER1_HEADERS), HttpResponseStatus.BAD_REQUEST); assertResponseStatus(doPutExternalAPI("/clusters/" + cluster.getId() + "9/config", requestStr, USER1_HEADERS), HttpResponseStatus.NOT_FOUND); assertResponseStatus(doPutExternalAPI("/clusters/" + cluster.getId() + "/config", requestStr, USER2_HEADERS), HttpResponseStatus.NOT_FOUND); cluster.setStatus(Cluster.Status.INCOMPLETE); clusterStoreService.getView(cluster.getAccount()).writeCluster(cluster); assertResponseStatus(doPutExternalAPI("/clusters/" + cluster.getId() + "/config", requestStr, USER1_HEADERS), HttpResponseStatus.CONFLICT); }
@Test public void testAdminCanDeleteClustersOwnedByOthers() throws Exception { String clusterId = "2"; Cluster cluster = Entities.ClusterExample.createCluster(); cluster.setStatus(Cluster.Status.ACTIVE); ClusterJob clusterJob = new ClusterJob(new JobId(clusterId, 1), ClusterAction.CLUSTER_DELETE); clusterJob.setJobStatus(ClusterJob.Status.COMPLETE); cluster.setLatestJobId(clusterJob.getJobId()); clusterStoreService.getView(cluster.getAccount()).writeCluster(cluster); clusterStore.writeClusterJob(clusterJob); assertResponseStatus(doDeleteExternalAPI("/clusters/" + clusterId, ADMIN_HEADERS), HttpResponseStatus.OK); }
@Test public void testClusterCreateLeaseDuration() throws Exception { // Reactor template has forever initial lease duration verifyInitialLeaseDuration(200, HttpResponseStatus.OK, 200, reactorTemplate.getName()); verifyInitialLeaseDuration(0, HttpResponseStatus.OK, 0, reactorTemplate.getName()); verifyInitialLeaseDuration(0, HttpResponseStatus.OK, -1, reactorTemplate.getName()); // Small template has 10000 initial lease duration verifyInitialLeaseDuration(10000, HttpResponseStatus.BAD_REQUEST, 20000, smallTemplate.getName()); verifyInitialLeaseDuration(10000, HttpResponseStatus.OK, 10000, smallTemplate.getName()); verifyInitialLeaseDuration(500, HttpResponseStatus.OK, 500, smallTemplate.getName()); verifyInitialLeaseDuration(10000, HttpResponseStatus.BAD_REQUEST, 0, smallTemplate.getName()); verifyInitialLeaseDuration(10000, HttpResponseStatus.OK, -1, smallTemplate.getName()); }
@Test public void testAddServicesOnNonexistantClusterReturns404() throws Exception { Cluster cluster = Cluster.builder() .setID("123") .setAccount(USER1_ACCOUNT) .setName("test-cluster") .setClusterTemplate(Entities.ClusterTemplateExample.HDFS) .setServices(ImmutableSet.<String>of("namenode", "datanode")) .setStatus(Cluster.Status.ACTIVE) .build(); clusterStoreService.getView(cluster.getAccount()).writeCluster(cluster); AddServicesRequest body = new AddServicesRequest(null, ImmutableSet.of("resourcemanager", "nodemanager")); assertResponseStatus(doPostExternalAPI("/clusters/1123/services", gson.toJson(body), USER1_HEADERS), HttpResponseStatus.NOT_FOUND); assertResponseStatus(doPostExternalAPI("/clusters/123/services", gson.toJson(body), USER2_HEADERS), HttpResponseStatus.NOT_FOUND); }
@Test public void testGetServicesFromNonexistantClusterReturns404() throws Exception { assertResponseStatus(doGetExternalAPI("/clusters/567/services", USER1_HEADERS), HttpResponseStatus.NOT_FOUND); }
private void verifyInitialLeaseDuration(long expectedExpireTime, HttpResponseStatus expectedStatus, long requestedLeaseDuration, String clusterTemplate) throws Exception { ClusterCreateRequest clusterCreateRequest = ClusterCreateRequest.builder() .setName("test-lease") .setClusterTemplateName(clusterTemplate) .setNumMachines(4) .setInitialLeaseDuration(requestedLeaseDuration) .build(); HttpResponse response = doPostExternalAPI("/clusters", gson.toJson(clusterCreateRequest), USER1_HEADERS); assertResponseStatus(response, expectedStatus); if (expectedStatus == HttpResponseStatus.BAD_REQUEST) { return; } solverScheduler.run(); String clusterId = getIdFromResponse(response); Cluster cluster = clusterStoreService.getView(USER1_ACCOUNT).getCluster(clusterId); Assert.assertEquals(Cluster.Status.PENDING, cluster.getStatus()); if (expectedExpireTime == 0) { Assert.assertEquals(expectedExpireTime, cluster.getExpireTime()); } else { Assert.assertEquals(expectedExpireTime, cluster.getExpireTime() == 0 ? 0 : cluster.getExpireTime() - cluster.getCreateTime()); } }
@Test public void testPutClusterConfigCanRunOnInconsistentClusters() throws Exception { Cluster cluster = Cluster.builder() .setID("123") .setAccount(USER1_ACCOUNT) .setName("get-config-test") .setProvider(Entities.ProviderExample.JOYENT) .setClusterTemplate(Entities.ClusterTemplateExample.HDFS) .build(); cluster.setStatus(Cluster.Status.INCONSISTENT); clusterStoreService.getView(cluster.getAccount()).writeCluster(cluster); String requestStr = gson.toJson(new ClusterConfigureRequest(null, new JsonObject(), false)); assertResponseStatus(doPutExternalAPI("/clusters/" + cluster.getId() + "/config", requestStr, USER1_HEADERS), HttpResponseStatus.OK); }
@Test public void testAdminCanGetClustersOwnedByOthers() throws Exception { ClusterCreateRequest clusterCreateRequest = ClusterCreateRequest.builder() .setName("cluster1") .setClusterTemplateName(reactorTemplate.getName()) .setNumMachines(5) .build(); HttpResponse response = doPostExternalAPI("/clusters", gson.toJson(clusterCreateRequest), USER1_HEADERS); assertResponseStatus(response, HttpResponseStatus.OK); String clusterId = getIdFromResponse(response); assertResponseStatus(doGetExternalAPI("/clusters/" + clusterId, ADMIN_HEADERS), HttpResponseStatus.OK); }
@Test public void testAddInvalidServicesReturns400() throws Exception { Cluster cluster = Cluster.builder() .setID("123") .setAccount(USER1_ACCOUNT) .setName("test-cluster") .setClusterTemplate(Entities.ClusterTemplateExample.HDFS) .setServices(ImmutableSet.<String>of("namenode", "datanode")) .setStatus(Cluster.Status.ACTIVE) .build(); clusterStoreService.getView(cluster.getAccount()).writeCluster(cluster); // can't add nodemanager without resourcemanager AddServicesRequest body = new AddServicesRequest(null, ImmutableSet.of("nodemanager")); assertResponseStatus(doPostExternalAPI("/clusters/123/services", gson.toJson(body), USER1_HEADERS), HttpResponseStatus.BAD_REQUEST); // can't add nonexistant service body = new AddServicesRequest(null, ImmutableSet.of("fakeservice")); assertResponseStatus(doPostExternalAPI("/clusters/123/services", gson.toJson(body), USER1_HEADERS), HttpResponseStatus.BAD_REQUEST); }
@Test public void testInvalidGetClusterConfigRequests() throws Exception { Cluster cluster = Cluster.builder() .setID("123") .setAccount(USER1_ACCOUNT) .setName("get-config-test") .setClusterTemplate(Entities.ClusterTemplateExample.HDFS) .build(); clusterStoreService.getView(cluster.getAccount()).writeCluster(cluster); assertResponseStatus(doGetExternalAPI("/clusters/" + cluster.getId() + "9/config", USER1_HEADERS), HttpResponseStatus.NOT_FOUND); assertResponseStatus(doGetExternalAPI("/clusters/" + cluster.getId() + "/config", USER2_HEADERS), HttpResponseStatus.NOT_FOUND); }