@Override public ClusterConfigureRequest 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()); Boolean restart = context.deserialize(jsonObj.get("restart"), Boolean.class); JsonObject config = context.deserialize(jsonObj.get("config"), JsonObject.class); return new ClusterConfigureRequest(providerFields, config, restart); } }
boolean restartServices = request.getRestart(); JsonObject config = request.getConfig();
@Test public void testClusterConfigure() throws Exception { Cluster cluster = createActiveCluster(); Map<String, Object> providerFields = Maps.newHashMap(); providerFields.put("keyname", "somename"); providerFields.put("key", "somecontents"); providerFields.put("url", "internal.net/api"); ClusterConfigureRequest configureRequest = new ClusterConfigureRequest(providerFields, new JsonObject(), false); clusterService.requestClusterReconfigure(cluster.getId(), account, configureRequest); cluster = clusterStore.getCluster(cluster.getId()); // key and url are both sensitive fields Map<String, String> expectedSensitiveFields = ImmutableMap.of( "key", "somecontents", "url", "internal.net/api" ); // nonsensitive fields should be everything currently in the provider plus the nonsensitive user fields // given in the request Map<String, Object> expectedNonsensitiveFields = Maps.newHashMap(provider.getProvisionerFields()); expectedNonsensitiveFields.put("keyname", "somename"); Assert.assertEquals(expectedNonsensitiveFields, cluster.getProvider().getProvisionerFields()); Assert.assertEquals(expectedSensitiveFields, credentialStore.get(account.getTenantId(), cluster.getId())); }
@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); }
@Test public void testRequiredUserFields() throws Exception { Cluster cluster = createActiveCluster(); // the "key" user field is required. Should throw an except if its not set. Map<String, Object> providerFields = Maps.newHashMap(); ClusterConfigureRequest configureRequest = new ClusterConfigureRequest(providerFields, new JsonObject(), false); boolean failed = false; try { clusterService.requestClusterReconfigure(cluster.getId(), account, configureRequest); } catch (MissingFieldsException e) { // this is expected failed = true; } Assert.assertTrue(failed); // now try with required user field set providerFields.put("key", "keycontents"); configureRequest = new ClusterConfigureRequest(providerFields, new JsonObject(), false); clusterService.requestClusterReconfigure(cluster.getId(), account, configureRequest); // 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()); // key and url are both sensitive fields Map<String, String> expectedSensitiveFields = ImmutableMap.of( "key", "keycontents" ); Assert.assertEquals(expectedNonsensitiveFields, cluster.getProvider().getProvisionerFields()); Assert.assertEquals(expectedSensitiveFields, credentialStore.get(account.getTenantId(), cluster.getId())); }
@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 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); }