use of org.apache.heron.spi.common.Config in project heron by twitter.
the class KubernetesContextTest method testPodTemplateDisabled.
@Test
public void testPodTemplateDisabled() {
Assert.assertFalse(KubernetesContext.getPodTemplateDisabled(config));
Assert.assertFalse(KubernetesContext.getPodTemplateDisabled(configWithPodTemplateConfigMap));
final Config configWithPodTemplateConfigMapOff = Config.newBuilder().put(KubernetesContext.KUBERNETES_POD_TEMPLATE_LOCATION, POD_TEMPLATE_CONFIGMAP_NAME).put(KubernetesContext.KUBERNETES_POD_TEMPLATE_DISABLED, "TRUE").build();
Assert.assertTrue(KubernetesContext.getPodTemplateDisabled(configWithPodTemplateConfigMapOff));
}
use of org.apache.heron.spi.common.Config in project heron by twitter.
the class KubernetesContextTest method testPodTemplateConfigMapName.
@Test
public void testPodTemplateConfigMapName() {
final String executorKey = String.format(KubernetesContext.KUBERNETES_POD_TEMPLATE_LOCATION, KubernetesConstants.EXECUTOR_NAME);
final Config configExecutor = Config.newBuilder().put(executorKey, POD_TEMPLATE_CONFIGMAP_NAME).build();
Assert.assertEquals("Executor location", POD_TEMPLATE_CONFIGMAP_NAME, KubernetesContext.getPodTemplateConfigMapName(configExecutor, true));
final String managerKey = String.format(KubernetesContext.KUBERNETES_POD_TEMPLATE_LOCATION, KubernetesConstants.MANAGER_NAME);
final Config configManager = Config.newBuilder().put(managerKey, POD_TEMPLATE_CONFIGMAP_NAME).build();
Assert.assertEquals("Manager location", POD_TEMPLATE_CONFIGMAP_NAME, KubernetesContext.getPodTemplateConfigMapName(configManager, false));
Assert.assertNull("No Pod Template", KubernetesContext.getPodTemplateConfigMapName(config, true));
}
use of org.apache.heron.spi.common.Config in project heron by twitter.
the class KubernetesContextTest method createVolumeNFS.
/**
* Create test cases for <code>NFS</code>.
* @param testCases Test case container.
* Input: [0] Config, [1] Boolean to indicate Manager/Executor.
* Output: <code>Map<String, Map<VolumeConfigKeys, String></code>
* @param isExecutor Boolean to indicate Manager/Executor test case generation.
*/
private void createVolumeNFS(List<TestTuple<Pair<Config, Boolean>, Map<String, Map<VolumeConfigKeys, String>>>> testCases, boolean isExecutor) {
final String volumeNameValid = "volume-name-valid";
final String passingValue = "should-pass";
final String processName = isExecutor ? KubernetesConstants.EXECUTOR_NAME : KubernetesConstants.MANAGER_NAME;
final String keyPattern = String.format(KubernetesContext.KUBERNETES_VOLUME_NFS_PREFIX + "%%s.%%s", processName);
// With readOnly.
final Map<String, Map<VolumeConfigKeys, String>> expectedWithReadOnly = ImmutableMap.of(volumeNameValid, new HashMap<VolumeConfigKeys, String>() {
{
put(VolumeConfigKeys.server, "nfs-server.default.local");
put(VolumeConfigKeys.readOnly, "true");
put(VolumeConfigKeys.pathOnNFS, passingValue);
put(VolumeConfigKeys.path, passingValue);
put(VolumeConfigKeys.subPath, passingValue);
put(VolumeConfigKeys.readOnly, passingValue);
}
});
final Config configWithReadOnly = Config.newBuilder().put(String.format(keyPattern, volumeNameValid, "server"), "nfs-server.default.local").put(String.format(keyPattern, volumeNameValid, "readOnly"), "true").put(String.format(keyPattern, volumeNameValid, "pathOnNFS"), passingValue).put(String.format(keyPattern, volumeNameValid, "path"), passingValue).put(String.format(keyPattern, volumeNameValid, "subPath"), passingValue).put(String.format(keyPattern, volumeNameValid, "readOnly"), passingValue).build();
testCases.add(new TestTuple<>(processName + ": `NFS` with `readOnly`", new Pair<>(configWithReadOnly, isExecutor), expectedWithReadOnly));
// With readOnly.
final Map<String, Map<VolumeConfigKeys, String>> expectedWithoutReadOnly = ImmutableMap.of(volumeNameValid, new HashMap<VolumeConfigKeys, String>() {
{
put(VolumeConfigKeys.server, "nfs-server.default.local");
put(VolumeConfigKeys.pathOnNFS, passingValue);
put(VolumeConfigKeys.path, passingValue);
put(VolumeConfigKeys.subPath, passingValue);
put(VolumeConfigKeys.readOnly, passingValue);
}
});
final Config configWithoutReadOnly = Config.newBuilder().put(String.format(keyPattern, volumeNameValid, "server"), "nfs-server.default.local").put(String.format(keyPattern, volumeNameValid, "pathOnNFS"), passingValue).put(String.format(keyPattern, volumeNameValid, "path"), passingValue).put(String.format(keyPattern, volumeNameValid, "subPath"), passingValue).put(String.format(keyPattern, volumeNameValid, "readOnly"), passingValue).build();
testCases.add(new TestTuple<>(processName + ": `NFS` without `readOnly`", new Pair<>(configWithoutReadOnly, isExecutor), expectedWithoutReadOnly));
// Ignored.
final Config configIgnored = Config.newBuilder().put(String.format(keyPattern, volumeNameValid, "server"), "nfs-server.default.local").put(String.format(keyPattern, volumeNameValid, "readOnly"), "true").put(String.format(keyPattern, volumeNameValid, "pathOnNFS"), passingValue).put(String.format(keyPattern, volumeNameValid, "path"), passingValue).put(String.format(keyPattern, volumeNameValid, "subPath"), passingValue).put(String.format(keyPattern, volumeNameValid, "readOnly"), passingValue).build();
testCases.add(new TestTuple<>(processName + ": `NFS` ignored", new Pair<>(configIgnored, !isExecutor), new HashMap<>()));
}
use of org.apache.heron.spi.common.Config in project heron by twitter.
the class KubernetesContextTest method createVolumeEmptyDir.
/**
* Create test cases for <code>Empty Directory</code>.
* @param testCases Test case container.
* Input: [0] Config, [1] Boolean to indicate Manager/Executor.
* Output: <code>Map<String, Map<VolumeConfigKeys, String></code>
* @param isExecutor Boolean to indicate Manager/Executor test case generation.
*/
private void createVolumeEmptyDir(List<TestTuple<Pair<Config, Boolean>, Map<String, Map<VolumeConfigKeys, String>>>> testCases, boolean isExecutor) {
final String volumeNameValid = "volume-name-valid";
final String passingValue = "should-pass";
final String processName = isExecutor ? KubernetesConstants.EXECUTOR_NAME : KubernetesConstants.MANAGER_NAME;
final String keyPattern = String.format(KubernetesContext.KUBERNETES_VOLUME_EMPTYDIR_PREFIX + "%%s.%%s", processName);
// With Medium.
final Map<String, Map<VolumeConfigKeys, String>> expectedWithMedium = ImmutableMap.of(volumeNameValid, new HashMap<VolumeConfigKeys, String>() {
{
put(VolumeConfigKeys.sizeLimit, passingValue);
put(VolumeConfigKeys.medium, "Memory");
put(VolumeConfigKeys.path, passingValue);
put(VolumeConfigKeys.subPath, passingValue);
put(VolumeConfigKeys.readOnly, passingValue);
}
});
final Config configWithMedium = Config.newBuilder().put(String.format(keyPattern, volumeNameValid, "sizeLimit"), passingValue).put(String.format(keyPattern, volumeNameValid, "medium"), "Memory").put(String.format(keyPattern, volumeNameValid, "path"), passingValue).put(String.format(keyPattern, volumeNameValid, "subPath"), passingValue).put(String.format(keyPattern, volumeNameValid, "readOnly"), passingValue).build();
testCases.add(new TestTuple<>(processName + ": `emptyDir` with `medium`", new Pair<>(configWithMedium, isExecutor), expectedWithMedium));
// With empty Medium.
final Map<String, Map<VolumeConfigKeys, String>> expectedEmptyMedium = ImmutableMap.of(volumeNameValid, new HashMap<VolumeConfigKeys, String>() {
{
put(VolumeConfigKeys.sizeLimit, passingValue);
put(VolumeConfigKeys.medium, "");
put(VolumeConfigKeys.path, passingValue);
put(VolumeConfigKeys.subPath, passingValue);
put(VolumeConfigKeys.readOnly, passingValue);
}
});
final Config configEmptyMedium = Config.newBuilder().put(String.format(keyPattern, volumeNameValid, "sizeLimit"), passingValue).put(String.format(keyPattern, volumeNameValid, "medium"), "").put(String.format(keyPattern, volumeNameValid, "path"), passingValue).put(String.format(keyPattern, volumeNameValid, "subPath"), passingValue).put(String.format(keyPattern, volumeNameValid, "readOnly"), passingValue).build();
testCases.add(new TestTuple<>(processName + ": `emptyDir` with empty `medium`", new Pair<>(configEmptyMedium, isExecutor), expectedEmptyMedium));
// Without Medium.
final Map<String, Map<VolumeConfigKeys, String>> expectedNoMedium = ImmutableMap.of(volumeNameValid, new HashMap<VolumeConfigKeys, String>() {
{
put(VolumeConfigKeys.sizeLimit, passingValue);
put(VolumeConfigKeys.path, passingValue);
put(VolumeConfigKeys.subPath, passingValue);
put(VolumeConfigKeys.readOnly, passingValue);
}
});
final Config configNoMedium = Config.newBuilder().put(String.format(keyPattern, volumeNameValid, "sizeLimit"), passingValue).put(String.format(keyPattern, volumeNameValid, "path"), passingValue).put(String.format(keyPattern, volumeNameValid, "subPath"), passingValue).put(String.format(keyPattern, volumeNameValid, "readOnly"), passingValue).build();
testCases.add(new TestTuple<>(processName + ": `emptyDir` without `medium`", new Pair<>(configNoMedium, isExecutor), expectedNoMedium));
// Ignored.
final Config configIgnored = Config.newBuilder().put(String.format(keyPattern, volumeNameValid, "sizeLimit"), passingValue).put(String.format(keyPattern, volumeNameValid, "medium"), "").put(String.format(keyPattern, volumeNameValid, "path"), passingValue).put(String.format(keyPattern, volumeNameValid, "subPath"), passingValue).put(String.format(keyPattern, volumeNameValid, "readOnly"), passingValue).build();
testCases.add(new TestTuple<>(processName + ": `emptyDir` ignored", new Pair<>(configIgnored, !isExecutor), new HashMap<>()));
}
use of org.apache.heron.spi.common.Config in project heron by twitter.
the class KubernetesContextTest method createVolumeHostPathError.
/**
* Create test cases for <code>Host Path</code> errors.
* @param testCases Test case container.
* Input: [0] Config, [1] Boolean to indicate Manager/Executor.
* Output: Error message
* @param isExecutor Boolean to indicate Manager/Executor test case generation.
*/
private void createVolumeHostPathError(List<TestTuple<Pair<Config, Boolean>, String>> testCases, boolean isExecutor) {
final String volumeNameValid = "volume-name-valid";
final String passingValue = "should-pass";
final String failureValue = "Should-Fail";
final String processName = isExecutor ? KubernetesConstants.EXECUTOR_NAME : KubernetesConstants.MANAGER_NAME;
final String keyPattern = String.format(KubernetesContext.KUBERNETES_VOLUME_HOSTPATH_PREFIX + "%%s.%%s", processName);
// Type is invalid.
final Config configInvalidMedium = Config.newBuilder().put(String.format(keyPattern, volumeNameValid, "type"), failureValue).put(String.format(keyPattern, volumeNameValid, "pathOnHost"), passingValue).put(String.format(keyPattern, volumeNameValid, "path"), passingValue).put(String.format(keyPattern, volumeNameValid, "subPath"), passingValue).build();
testCases.add(new TestTuple<>(processName + ": Invalid 'type' should trigger exception", new Pair<>(configInvalidMedium, isExecutor), "Host Path 'type' of"));
// Path on Host is missing.
final Config configNoHostOnPath = Config.newBuilder().put(String.format(keyPattern, volumeNameValid, "type"), "BlockDevice").put(String.format(keyPattern, volumeNameValid, "path"), passingValue).put(String.format(keyPattern, volumeNameValid, "subPath"), passingValue).build();
testCases.add(new TestTuple<>(processName + ": No 'hostOnPath' should trigger exception", new Pair<>(configNoHostOnPath, isExecutor), "requires a path on the host"));
// Path on Host is empty.
final Config configEmptyHostOnPath = Config.newBuilder().put(String.format(keyPattern, volumeNameValid, "type"), "BlockDevice").put(String.format(keyPattern, volumeNameValid, "pathOnHost"), "").put(String.format(keyPattern, volumeNameValid, "path"), passingValue).put(String.format(keyPattern, volumeNameValid, "subPath"), passingValue).build();
testCases.add(new TestTuple<>(processName + ": Empty 'hostOnPath' should trigger exception", new Pair<>(configEmptyHostOnPath, isExecutor), "requires a path on the host"));
// Invalid option.
final Config configInvalidOption = Config.newBuilder().put(String.format(keyPattern, volumeNameValid, "type"), "BlockDevice").put(String.format(keyPattern, volumeNameValid, "pathOnHost"), passingValue).put(String.format(keyPattern, volumeNameValid, "path"), passingValue).put(String.format(keyPattern, volumeNameValid, "subPath"), passingValue).put(String.format(keyPattern, volumeNameValid, "accessModes"), passingValue).build();
testCases.add(new TestTuple<>(processName + ": Invalid option should trigger exception", new Pair<>(configInvalidOption, isExecutor), "Invalid Host Path option for"));
}
Aggregations