/* * 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 gobblin.config.store.hdfs; import java.io.BufferedWriter; import java.io.File; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.URI; import java.net.URISyntaxException; import java.util.Collection; import java.util.List; import java.util.Properties; import com.google.common.base.Charsets; import com.google.common.collect.ImmutableList; import com.typesafe.config.Config; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import gobblin.config.common.impl.SingleLinkedListConfigKeyPath; import gobblin.config.store.api.ConfigKeyPath; import gobblin.config.store.api.ConfigStoreCreationException; import gobblin.config.store.deploy.ClasspathConfigSource; import gobblin.config.store.deploy.FsDeploymentConfig; import gobblin.util.PathUtils; /** * Unit tests for {@link SimpleHDFSConfigStore} and {@link SimpleHDFSConfigStoreFactory}. */ @Test(groups = "gobblin.config.store.hdfs") public class SimpleHdfsConfigStoreTest { private static final String CONFIG_DIR_NAME = "configDir"; private static final String VERSION = "v1.0"; private static final Path CONFIG_DIR_PATH = PathUtils.combinePaths(CONFIG_DIR_NAME, SimpleHDFSConfigStore.CONFIG_STORE_NAME, VERSION); /**Set by {@link TestEnvironment#setup()}**/ public static final String TAG_NAME_SYS_PROP_KEY = "sysProp.tagName1"; public static final String TAG_NAME_SYS_PROP_VALUE = "tag1"; private FileSystem fs; private SimpleHDFSConfigStore simpleHDFSConfigStore; @BeforeClass public void setUp() throws URISyntaxException, ConfigStoreCreationException, IOException { this.fs = FileSystem.getLocal(new Configuration()); this.fs.mkdirs(CONFIG_DIR_PATH); SimpleLocalHDFSConfigStoreFactory simpleHDFSConfigStoreConfigFactory = new SimpleLocalHDFSConfigStoreFactory(); URI storeURI = getStoreURI(System.getProperty("user.dir") + File.separator + CONFIG_DIR_NAME); this.simpleHDFSConfigStore = simpleHDFSConfigStoreConfigFactory.createConfigStore(storeURI); this.simpleHDFSConfigStore.deploy(new FsDeploymentConfig(new ClasspathConfigSource(new Properties()), VERSION)); } @Test public void testGetCurrentVersion() throws IOException { Assert.assertEquals(this.simpleHDFSConfigStore.getCurrentVersion(), VERSION); String newVersion = "v1.1"; this.simpleHDFSConfigStore.deploy(new FsDeploymentConfig(new ClasspathConfigSource(new Properties()), newVersion)); Assert.assertEquals(this.simpleHDFSConfigStore.getCurrentVersion(), newVersion); } @Test public void getStoreURI() { URI storeURI = this.simpleHDFSConfigStore.getStoreURI(); Assert.assertEquals(storeURI.getScheme(), SimpleHDFSConfigStoreFactory.SIMPLE_HDFS_SCHEME_PREFIX + "file"); Assert.assertNull(storeURI.getAuthority()); Assert.assertEquals(storeURI.getPath(), System.getProperty("user.dir") + File.separator + CONFIG_DIR_NAME); } @Test public void testGetChildren() throws IOException, URISyntaxException, ConfigStoreCreationException { String datasetName = "dataset-test-get-children"; String childDatasetName = "childDataset"; Path datasetPath = new Path(CONFIG_DIR_PATH, datasetName); try { this.fs.mkdirs(new Path(datasetPath, childDatasetName)); ConfigKeyPath datasetConfigKey = SingleLinkedListConfigKeyPath.ROOT.createChild(datasetName); Collection<ConfigKeyPath> children = this.simpleHDFSConfigStore.getChildren(datasetConfigKey, VERSION); Assert.assertEquals(children.size(), 1); Assert.assertEquals(children.iterator().next().getOwnPathName(), childDatasetName); } finally { if (this.fs.exists(datasetPath)) { this.fs.delete(datasetPath, true); } } } @Test public void testGetOwnImports() throws IOException, URISyntaxException, ConfigStoreCreationException { String datasetName = "dataset-test-get-own-imports"; String tagKey1 = "/path/to/tag1"; String tagKey2 = "/path/to/tag2"; Path datasetPath = new Path(CONFIG_DIR_PATH, datasetName); try { this.fs.mkdirs(datasetPath); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(this.fs.create(new Path(datasetPath, "includes.conf")), Charsets.UTF_8)); writer.write(tagKey1); writer.newLine(); writer.write(tagKey2); writer.close(); ConfigKeyPath datasetConfigKey = SingleLinkedListConfigKeyPath.ROOT.createChild(datasetName); List<ConfigKeyPath> imports = this.simpleHDFSConfigStore.getOwnImports(datasetConfigKey, VERSION); Assert.assertEquals(imports.size(), 2); Assert.assertEquals(imports.get(0).getAbsolutePathString(), tagKey2); Assert.assertEquals(imports.get(1).getAbsolutePathString(), tagKey1); } finally { if (this.fs.exists(datasetPath)) { this.fs.delete(datasetPath, true); } } } @Test public void testGetOwnImportsWithResolution() throws IOException, URISyntaxException, ConfigStoreCreationException { String datasetName = "dataset-test-get-own-imports-resolution"; Path datasetPath = new Path(CONFIG_DIR_PATH, datasetName); try { this.fs.mkdirs(datasetPath); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(this.fs.create(new Path(datasetPath, "includes.conf")), Charsets.UTF_8)); writer.write("/path/to/${?" + TAG_NAME_SYS_PROP_KEY + "}"); writer.close(); ConfigKeyPath datasetConfigKey = SingleLinkedListConfigKeyPath.ROOT.createChild(datasetName); List<ConfigKeyPath> imports = this.simpleHDFSConfigStore.getOwnImports(datasetConfigKey, VERSION); Assert.assertEquals(imports.size(), 1); Assert.assertEquals(imports.get(0).getAbsolutePathString(), "/path/to/" + TAG_NAME_SYS_PROP_VALUE); } finally { if (this.fs.exists(datasetPath)) { this.fs.delete(datasetPath, true); } } } @Test public void testGetOwnConfig() throws ConfigStoreCreationException, URISyntaxException, IOException { String datasetName = "dataset-test-get-own-config"; Path datasetPath = new Path(CONFIG_DIR_PATH, datasetName); try { this.fs.mkdirs(datasetPath); this.fs.create(new Path(datasetPath, "main.conf")).close(); ConfigKeyPath datasetConfigKey = SingleLinkedListConfigKeyPath.ROOT.createChild(datasetName); Config config = this.simpleHDFSConfigStore.getOwnConfig(datasetConfigKey, VERSION); Assert.assertTrue(config.isEmpty()); } finally { if (this.fs.exists(datasetPath)) { this.fs.delete(datasetPath, true); } } } @Test(dependsOnMethods = { "testGetCurrentVersion" }) public void testDeploy() throws Exception { Properties props = new Properties(); props.setProperty(ClasspathConfigSource.CONFIG_STORE_CLASSPATH_RESOURCE_NAME_KEY, "_testDeploy"); this.simpleHDFSConfigStore.deploy(new FsDeploymentConfig(new ClasspathConfigSource(props), "2.0")); Path versionPath = PathUtils.combinePaths(CONFIG_DIR_NAME, SimpleHDFSConfigStore.CONFIG_STORE_NAME, "2.0"); Assert.assertTrue(fs.exists(new Path(versionPath, "dir1"))); Assert.assertTrue(fs.exists(new Path(versionPath, "dir1/f1.conf"))); } @Test public void testResolveImports() throws Exception { List<String> unresolved = ImmutableList.of("/path/to/tag0", "/path/to/${?" + TAG_NAME_SYS_PROP_KEY + "}", "${?" + TAG_NAME_SYS_PROP_KEY + "}/${?" + TAG_NAME_SYS_PROP_KEY + "}"); List<String> resolved = SimpleHDFSConfigStore.resolveIncludesList(unresolved); List<String> expected = ImmutableList.of("/path/to/tag0", "/path/to/tag1", "tag1/tag1"); Assert.assertEquals(resolved, expected); } @AfterClass public void tearDown() throws IOException { if (this.fs.exists(new Path(CONFIG_DIR_NAME))) { this.fs.delete(new Path(CONFIG_DIR_NAME), true); } } private URI getStoreURI(String configDir) throws URISyntaxException { return new URI(SimpleHDFSConfigStoreFactory.SIMPLE_HDFS_SCHEME_PREFIX + "file", "localhost:8080", configDir, "", ""); } }