@Override public AddServicesRequest deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { JsonObject jsonObj = json.getAsJsonObject(); Map<String, Object> providerFields = context.deserialize(jsonObj.get("providerFields"), new TypeToken<Map<String, String>>() { }.getType()); Set<String> services = context.deserialize(jsonObj.get("services"), new TypeToken<Set<String>>() { }.getType()); return new AddServicesRequest(providerFields, services); } }
String servicesStr = Joiner.on(',').join(request.getServices()); try { changedNodes = solver.addServicesToCluster(cluster, clusterNodes, request.getServices()); } catch (IllegalArgumentException e) { LOG.debug("Could not add services {} to cluster {}.", servicesStr, cluster.getId(), e); request.getServices(), changedNodeIds); cluster.setLatestJobId(createJob.getJobId()); clusterStore.writeClusterJob(createJob);
@Test public void testUsesExistingCredentials() throws Exception { Cluster cluster = createActiveCluster(); // add required sensitive user field Map<String, Object> sensitiveFields = Maps.newHashMap(); sensitiveFields.put("key", "keycontents"); credentialStore.set(account.getTenantId(), cluster.getId(), sensitiveFields); // request doesn't contain the required key field, but it should be picked up from the credential store // so this should go through without throwing an exception. AddServicesRequest addServicesRequest = new AddServicesRequest(null, ImmutableSet.of(service2.getName())); clusterService.requestAddServices(cluster.getId(), account, addServicesRequest); }
solver.validateServicesToAdd(cluster, addRequest.getServices()); ClusterJob job = new ClusterJob(jobId, action, addRequest.getServices(), null); job.setJobStatus(ClusterJob.Status.RUNNING); cluster.setLatestJobId(job.getJobId());
@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 testAddServicesCanOnlyRunOnActiveCluster() throws Exception { Cluster cluster = Cluster.builder() .setID("123") .setAccount(USER1_ACCOUNT) .setName("test-cluster") .setClusterTemplate(Entities.ClusterTemplateExample.HDFS) .setServices(ImmutableSet.<String>of("namenode", "datanode")) .build(); Set<Cluster.Status> badStatuses = ImmutableSet.of( Cluster.Status.INCOMPLETE, Cluster.Status.PENDING, Cluster.Status.TERMINATED, Cluster.Status.INCONSISTENT); AddServicesRequest body = new AddServicesRequest(null, ImmutableSet.of("resourcemanager", "nodemanager")); for (Cluster.Status status : badStatuses) { cluster.setStatus(status); clusterStoreService.getView(cluster.getAccount()).writeCluster(cluster); assertResponseStatus(doPostExternalAPI("/clusters/123/services", gson.toJson(body), USER1_HEADERS), HttpResponseStatus.CONFLICT); } }
@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 testAddServices() throws Exception { Cluster cluster = createActiveCluster(); // add required sensitive user field Map<String, Object> sensitiveFields = Maps.newHashMap(); sensitiveFields.put("key", "keycontents"); AddServicesRequest addServicesRequest = new AddServicesRequest(sensitiveFields, ImmutableSet.of(service2.getName())); clusterService.requestAddServices(cluster.getId(), account, addServicesRequest); // nonsensitive fields should be everything currently in the provider before we get the updated cluster Map<String, Object> expectedNonsensitiveFields = cluster.getProvider().getProvisionerFields(); // get the updated cluster cluster = clusterStore.getCluster(cluster.getId()); // nonsensitive fields should be everything currently in the provider plus the nonsensitive user fields // given in the request Assert.assertEquals(expectedNonsensitiveFields, cluster.getProvider().getProvisionerFields()); Assert.assertEquals(sensitiveFields, credentialStore.get(account.getTenantId(), cluster.getId())); }
@Test public void testSensitiveUserFields() throws Exception { Map<String, Object> sensitiveFields = Maps.newHashMap(); sensitiveFields.put("key", "keycontents"); AddServicesRequest addRequest = new AddServicesRequest(sensitiveFields, ImmutableSet.of(service2.getName())); ClusterOperationRequest opRequest = new ClusterOperationRequest(sensitiveFields); Cluster cluster = createActiveCluster(); clusterService.requestAddServices(cluster.getId(), account, addRequest); testSensitiveFieldsAdded(cluster, sensitiveFields); clusterStore.deleteCluster(cluster.getId()); cluster = createActiveCluster(); clusterService.requestClusterDelete(cluster.getId(), account, opRequest); testSensitiveFieldsAdded(cluster, sensitiveFields); clusterStore.deleteCluster(cluster.getId()); cluster = createActiveCluster(); clusterService.requestServiceRuntimeAction(cluster.getId(), account, ClusterAction.RESTART_SERVICES, service1.getName(), opRequest); testSensitiveFieldsAdded(cluster, sensitiveFields); clusterStore.deleteCluster(cluster.getId()); }