@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(); } }
String requiredHardwareType = request.getHardwareType(); if (requiredHardwareType == null || requiredHardwareType.isEmpty()) { String requiredImageType = request.getImageType(); if (requiredImageType == null || requiredImageType.isEmpty()) { Set<String> serviceNames = request.getServices(); if (serviceNames == null || serviceNames.isEmpty()) { serviceNames = template.getClusterDefaults().getServices(); String dnsSuffix = request.getDnsSuffix(); if (dnsSuffix == null || dnsSuffix.isEmpty()) { dnsSuffix = template.getClusterDefaults().getDnsSuffix(); solveConstraints(cluster.getId(), template, request.getName(), request.getNumMachines(), hardwareTypeFlavors, imageTypeMap, serviceNames, serviceMap, dnsSuffix);
private Provider getProvider(ClusterTemplate template, ClusterCreateRequest request, EntityStoreView entityStore) throws IOException, MissingEntityException { // make sure the provider exists String providerName = request.getProvider(); if (providerName == null || providerName.isEmpty()) { providerName = template.getClusterDefaults().getProvider(); } Provider provider = entityStore.getProvider(providerName); if (provider == null) { throw new MissingEntityException("provider " + providerName + " does not exist."); } return provider; }
LOG.error( String.format("Could not solve cluster id %s named %s with template %s and %d machines", cluster.getId(), request.getName(), request.getClusterTemplate(), request.getNumMachines()));
private Cluster createUnsolvedCluster(Account account, ClusterCreateRequest createRequest) throws MissingEntityException, IOException, InvalidClusterException { String name = createRequest.getName(); int numMachines = createRequest.getNumMachines(); String templateName = createRequest.getClusterTemplate(); LOG.debug(String.format("Received a request to create cluster %s with %d machines from template %s", name, numMachines, templateName)); .setAccount(account) .setName(name) .setDescription(createRequest.getDescription()) .setID(clusterId); long requestedLease = createRequest.getInitialLeaseDuration(); long leaseDuration = template.getAdministration().getLeaseDuration().calcInitialLease(requestedLease); long createTime = System.currentTimeMillis();
@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()); }
private Set<String> getServices(ClusterTemplate template, ClusterCreateRequest createRequest) { // set cluster service names. Dependency checking is done later on since it involves a lot of potential lookups. Set<String> serviceNames = createRequest.getServices(); if (serviceNames == null || serviceNames.isEmpty()) { serviceNames = template.getClusterDefaults().getServices(); } return serviceNames; }
public ClusterCreateRequest build() { return new ClusterCreateRequest(name, description, clusterTemplateName, numMachines, providerName, providerFields, serviceNames, hardwareTypeName, imageTypeName, initialLeaseDuration, dnsSuffix, config); } }
private JsonObject getConfig(ClusterTemplate template, ClusterCreateRequest createRequest) { // use the config from the request if it exists. Otherwise use the template default JsonObject config = createRequest.getConfig(); if (config == null) { config = template.getClusterDefaults().getConfig(); } return config; }
ClusterCreateRequest clusterCreateRequest = ClusterCreateRequest.builder() .setName(clusterName) .setClusterTemplateName(smallTemplate.getName())
@Test(expected = MissingEntityException.class) public void testInvalidTemplateClusterCreate() throws Exception { String name = "clusty"; Map<String, Object> providerFields = ImmutableMap.<String, Object>of("keyname", "ec2", "key", "keycontents"); ClusterCreateRequest createRequest = ClusterCreateRequest.builder() .setName(name) .setClusterTemplateName("not" + basicTemplate.getName()) .setNumMachines(1) .setProviderFields(providerFields) .build(); clusterService.requestClusterCreate(createRequest, account); }
@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 testGetAllClustersReturnsOnlyThoseOwnedByUser() throws Exception { ClusterCreateRequest clusterCreateRequest = ClusterCreateRequest.builder() .setName("cluster1") .setClusterTemplateName(reactorTemplate.getName()) String cluster1 = getIdFromResponse(response); clusterCreateRequest = ClusterCreateRequest.builder() .setName("cluster2") .setClusterTemplateName(reactorTemplate.getName())
@Test public void testMaxClusterSize() throws Exception { Configuration conf = Configuration.create(); int maxClusterSize = conf.getInt(Constants.MAX_CLUSTER_SIZE); ClusterCreateRequest clusterCreateRequest = ClusterCreateRequest.builder() .setName("cluster") .setClusterTemplateName(smallTemplate.getName()) .setNumMachines(maxClusterSize + 1) .build(); assertResponseStatus(doPostExternalAPI("/clusters", gson.toJson(clusterCreateRequest), USER1_HEADERS), HttpResponseStatus.BAD_REQUEST); }
@Test(expected = MissingEntityException.class) public void testInvalidProviderClusterCreate() throws Exception { String name = "clusty"; Map<String, Object> providerFields = ImmutableMap.<String, Object>of("keyname", "ec2", "key", "keycontents"); ClusterCreateRequest createRequest = ClusterCreateRequest.builder() .setName(name) .setClusterTemplateName(basicTemplate.getName()) .setProviderName("not" + provider.getName()) .setNumMachines(1) .setProviderFields(providerFields) .build(); clusterService.requestClusterCreate(createRequest, account); }
@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); }
@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 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 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)); }