@Override public ClusterCreateRequest deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { JsonObject jsonObj = json.getAsJsonObject(); return ClusterCreateRequest.builder() .setName(context.<String>deserialize(jsonObj.get("name"), String.class)) .setDescription(context.<String>deserialize(jsonObj.get("description"), String.class)) .setClusterTemplateName(context.<String>deserialize(jsonObj.get("clusterTemplate"), String.class)) .setNumMachines(context.<Integer>deserialize(jsonObj.get("numMachines"), Integer.class)) .setProviderName(context.<String>deserialize(jsonObj.get("provider"), String.class)) .setHardwareTypeName(context.<String>deserialize(jsonObj.get("hardwaretype"), String.class)) .setImageTypeName(context.<String>deserialize(jsonObj.get("imagetype"), String.class)) .setInitialLeaseDuration(context.<Long>deserialize(jsonObj.get("initialLeaseDuration"), Long.class)) .setDNSSuffix(context.<String>deserialize(jsonObj.get("dnsSuffix"), String.class)) .setConfig(context.<JsonObject>deserialize(jsonObj.get("config"), JsonObject.class)) .setServiceNames(context.<Set<String>>deserialize( jsonObj.get("services"), new TypeToken<Set<String>>() { }.getType())) .setProviderFields(context.<Map<String, Object>>deserialize( jsonObj.get("providerFields"), new TypeToken<Map<String, Object>>() { }.getType())) .build(); } }
@Test public void testEndToEnd() throws Exception { ClusterCreateRequest request = ClusterCreateRequest.builder() .setName("mycluster") .setClusterTemplateName(reactorTemplate.getName()) .setNumMachines(5) .setInitialLeaseDuration(0L) .build(); Map<String, Node> nodes = solver.solveClusterNodes( getBaseBuilder().setClusterTemplate(reactorTemplate).setProvider(provider).build(), request); Multiset<Set<String>> serviceSetCounts = HashMultiset.create(); for (Node node : nodes.values()) { Set<String> serviceNames = Sets.newHashSet( Iterables.transform(node.getServices(), new Function<Service, String>() { @Override public String apply(Service input) { return input.getName(); } }) ); serviceSetCounts.add(serviceNames); } Assert.assertEquals(1, serviceSetCounts.count(ImmutableSet.of("namenode", "resourcemanager", "hbasemaster"))); Assert.assertEquals(3, serviceSetCounts.count(ImmutableSet.of("datanode", "nodemanager", "regionserver"))); Assert.assertEquals(1, serviceSetCounts.count(ImmutableSet.of("reactor", "zookeeper"))); }
@Test public void testAddClusterWithOptionalArgs() throws Exception { String clusterName = "my-cluster"; String tenantId = USER1_ACCOUNT.getTenantId(); ClusterCreateRequest clusterCreateRequest = ClusterCreateRequest.builder() .setName(clusterName) .setClusterTemplateName(reactorTemplate.getName()) .setNumMachines(5) .setProviderName("joyent") .setServiceNames(ImmutableSet.of("namenode", "datanode")) .setHardwareTypeName("large") .setImageTypeName("centos6") .setInitialLeaseDuration(-1L) .build(); HttpResponse response = doPostExternalAPI("/clusters", gson.toJson(clusterCreateRequest), USER1_HEADERS); assertResponseStatus(response, HttpResponseStatus.OK); // check there was an element added to the cluster queue for creating this cluster Element element = solverQueues.take(tenantId, "0"); SolverRequest request = gson.fromJson(element.getValue(), SolverRequest.class); ClusterCreateRequest createRequest = gson.fromJson(request.getJsonRequest(), ClusterCreateRequest.class); Assert.assertEquals("joyent", createRequest.getProvider()); Assert.assertEquals("centos6", createRequest.getImageType()); Assert.assertEquals("large", createRequest.getHardwareType()); Assert.assertEquals(ImmutableSet.of("namenode", "datanode"), createRequest.getServices()); }
.setProviderName("joyent") .setHardwareTypeName("medium") .setInitialLeaseDuration(0L) .build(); Map<String, Node> nodes = solver.solveClusterNodes( .setProviderName("joyent") .setHardwareTypeName("large-mem") .setInitialLeaseDuration(0L) .build(); nodes = solver.solveClusterNodes( .setProviderName("joyent") .setImageTypeName("ubuntu12") .setInitialLeaseDuration(0L) .build(); nodes = solver.solveClusterNodes( .setHardwareTypeName("small") .setImageTypeName("centos6") .setInitialLeaseDuration(0L) .build(); nodes = solver.solveClusterNodes(
.setClusterTemplateName(reactorTemplate.getName()) .setNumMachines(5) .setInitialLeaseDuration(0L) .build(); SolverRequest solverRequest = new SolverRequest(SolverRequest.Type.CREATE_CLUSTER, gson.toJson(createRequest));
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 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(expected = IllegalArgumentException.class) public void testNoAvailableHardwareTypesThrowsException() throws Exception { ClusterCreateRequest request = ClusterCreateRequest.builder() .setName("mycluster") .setClusterTemplateName(reactorTemplate.getName()) .setNumMachines(5) .setProviderName("rackspace") .setServiceNames(ImmutableSet.of("namenode", "datanode")) .setInitialLeaseDuration(-1L) .build(); solver.solveClusterNodes( getBaseBuilder().setClusterTemplate(reactorTemplate).setProvider(Entities.ProviderExample.RACKSPACE).build(), request); }
@Test(expected = IllegalArgumentException.class) public void testMissingServiceDependenciesThrowsException() throws Exception { ClusterCreateRequest request = ClusterCreateRequest.builder() .setName("mycluster") .setClusterTemplateName(reactorTemplate.getName()) .setNumMachines(5) .setProviderName("joyent") .setServiceNames(ImmutableSet.of("reactor", "datanode")) .setInitialLeaseDuration(-1L) .build(); solver.solveClusterNodes( getBaseBuilder().setClusterTemplate(reactorTemplate).setProvider(Entities.ProviderExample.JOYENT).build(), request); }
@Test(expected = IllegalArgumentException.class) public void testDisallowedServicesThrowsException() throws Exception { ClusterCreateRequest request = ClusterCreateRequest.builder() .setName("mycluster") .setClusterTemplateName(reactorTemplate.getName()) .setNumMachines(5) .setProviderName("joyent") .setServiceNames(ImmutableSet.of("namenode", "datanode", "mysql", "httpd")) .setInitialLeaseDuration(-1L) .build(); solver.solveClusterNodes( getBaseBuilder().setClusterTemplate(reactorTemplate).setProvider(Entities.ProviderExample.JOYENT).build(), request); }