blob: 2fbbc153c0b3e729a1f9baf06dd7c23dee1a9ffc [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.heron.apiserver.utils;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.junit.Test;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.SafeConstructor;
import org.apache.heron.common.basics.Pair;
import static org.junit.Assert.assertEquals;
public class ConfigUtilsTests {
@Test
@SuppressWarnings("unchecked")
public void testCreateOverrides() throws IOException {
final Properties overrideProperties = createOverrideProperties(
Pair.create("heron.statemgr.connection.string", "zookeeper:2181"),
Pair.create("heron.kubernetes.scheduler.uri", "http://127.0.0.1:8001")
);
final String overridesPath = ConfigUtils.createOverrideConfiguration(overrideProperties);
try (Reader reader = Files.newBufferedReader(Paths.get(overridesPath))) {
final Map<String, Object> overrides =
(Map<String, Object>) new Yaml(new SafeConstructor()).loadAs(reader, Map.class);
assertEquals(overrides.size(), overrideProperties.size());
for (String key : overrides.keySet()) {
assertEquals(overrides.get(key), overrideProperties.getProperty(key));
}
}
}
@Test
@SuppressWarnings("unchecked")
public void testStateManagerFileOverrides() throws IOException {
final Properties overrideProperties = createOverrideProperties(
Pair.create("heron.statemgr.connection.string", "zookeeper:2181"),
Pair.create("heron.kubernetes.scheduler.uri", "http://127.0.0.1:8001")
);
final String overridesPath = ConfigUtils.createOverrideConfiguration(overrideProperties);
// write default state manager config
final Path stateManagerPath = Files.createTempFile("statemgr-", ".yaml");
stateManagerPath.toFile().deleteOnExit();
try (Writer writer = Files.newBufferedWriter(stateManagerPath)) {
final Map<String, String> config = new HashMap<>();
config.put("heron.statemgr.connection.string", "<host>:<port>");
new Yaml(new SafeConstructor()).dump(config, writer);
}
// apply the overrides
ConfigUtils.applyOverridesToStateManagerConfig(Paths.get(overridesPath), stateManagerPath);
try (Reader reader = Files.newBufferedReader(stateManagerPath)) {
final Map<String, Object> stateManagerWithOverrides =
(Map<String, Object>) new Yaml(new SafeConstructor()).loadAs(reader, Map.class);
assertEquals(stateManagerWithOverrides.size(), 1);
assertEquals(stateManagerWithOverrides.get("heron.statemgr.connection.string"),
"zookeeper:2181");
}
}
@Test
@SuppressWarnings("unchecked")
public void testNoOverridesAppliedToStateManager() throws IOException {
final Properties overrideProperties = createOverrideProperties(
Pair.create("heron.kubernetes.scheduler.uri", "http://127.0.0.1:8001")
);
final String overridesPath = ConfigUtils.createOverrideConfiguration(overrideProperties);
// write default state manager config
final Path stateManagerPath = Files.createTempFile("statemgr-", ".yaml");
stateManagerPath.toFile().deleteOnExit();
try (Writer writer = Files.newBufferedWriter(stateManagerPath)) {
final Map<String, String> config = new HashMap<>();
config.put("heron.statemgr.connection.string", "<host>:<port>");
new Yaml(new SafeConstructor()).dump(config, writer);
}
// apply the overrides
ConfigUtils.applyOverridesToStateManagerConfig(Paths.get(overridesPath), stateManagerPath);
try (Reader reader = Files.newBufferedReader(stateManagerPath)) {
final Map<String, Object> stateManagerWithOverrides =
(Map<String, Object>) new Yaml(new SafeConstructor()).loadAs(reader, Map.class);
assertEquals(stateManagerWithOverrides.size(), 1);
assertEquals(stateManagerWithOverrides.get("heron.statemgr.connection.string"),
"<host>:<port>");
}
}
@Test
@SuppressWarnings("unchecked")
public void testApplyOverrides() throws IOException {
final Properties overrideProperties = createOverrideProperties(
Pair.create("heron.statemgr.connection.string", "zookeeper:2181"),
Pair.create("heron.kubernetes.scheduler.uri", "http://127.0.0.1:8001")
);
final String overridesPath = ConfigUtils.createOverrideConfiguration(overrideProperties);
final Map<String, String> overrides = createOverrides(
Pair.create("my.override.key", "my.override.value")
);
ConfigUtils.applyOverrides(Paths.get(overridesPath), overrides);
final Map<String, String> combinedOverrides = new HashMap<>();
combinedOverrides.putAll(overrides);
for (String key : overrideProperties.stringPropertyNames()) {
combinedOverrides.put(key, overrideProperties.getProperty(key));
}
try (Reader reader = Files.newBufferedReader(Paths.get(overridesPath))) {
final Map<String, Object> newOverrides =
(Map<String, Object>) new Yaml(new SafeConstructor()).loadAs(reader, Map.class);
assertEquals(newOverrides, combinedOverrides);
}
}
@Test
@SuppressWarnings("unchecked")
public void testApplyEmptyOverrides() throws IOException {
final Properties overrideProperties = createOverrideProperties(
Pair.create("heron.statemgr.connection.string", "zookeeper:2181"),
Pair.create("heron.kubernetes.scheduler.uri", "http://127.0.0.1:8001")
);
final String overridesPath = ConfigUtils.createOverrideConfiguration(overrideProperties);
ConfigUtils.applyOverrides(Paths.get(overridesPath), new HashMap<>());
final Map<String, String> overrides = new HashMap<>();
for (String key : overrideProperties.stringPropertyNames()) {
overrides.put(key, overrideProperties.getProperty(key));
}
try (Reader reader = Files.newBufferedReader(Paths.get(overridesPath))) {
final Map<String, Object> newOverrides =
(Map<String, Object>) new Yaml(new SafeConstructor()).loadAs(reader, Map.class);
assertEquals(newOverrides, overrides);
}
}
@SuppressWarnings("unchecked")
private Map<String, String> createOverrides(Pair<String, String>... keyValues) {
final Map<String, String> overrides = new HashMap<>();
for (Pair<String, String> kv : keyValues) {
overrides.put(kv.first, kv.second);
}
return overrides;
}
@SuppressWarnings("unchecked")
private Properties createOverrideProperties(Pair<String, String>... props) {
final Properties properties = new Properties();
for (Pair<String, String> prop : props) {
properties.setProperty(prop.first, prop.second);
}
return properties;
}
}