blob: 1b33e1b538c79e629cd5744c47ca546a641f771a [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.falcon.extensions.store;
import com.google.common.collect.ImmutableMap;
import org.apache.falcon.FalconException;
import org.apache.falcon.entity.parser.ValidationException;
import org.apache.falcon.entity.store.StoreAccessException;
import org.apache.falcon.extensions.jdbc.ExtensionMetaStore;
import org.apache.falcon.extensions.mirroring.hdfs.HdfsMirroringExtension;
import org.apache.falcon.hadoop.JailedFileSystem;
import org.apache.falcon.service.FalconJPAService;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.LocalFileSystem;
import org.apache.hadoop.fs.Path;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URISyntaxException;
import java.util.Map;
/**
* Tests for extension store.
*/
public class ExtensionStoreTest extends AbstractTestExtensionStore {
private static Map<String, String> resourcesMap;
private static JailedFileSystem fs;
protected static final String EXTENSION_PATH = "/projects/falcon/extension";
private static final String STORAGE_URL = "jail://global:00";
@BeforeClass
public void init() throws Exception {
initExtensionStore();
resourcesMap = ImmutableMap.of(
"hdfs-mirroring-template.xml", extensionStorePath
+ "/hdfs-mirroring/resources/runtime/hdfs-mirroring-template.xml",
"hdfs-mirroring-workflow.xml", extensionStorePath
+ "/hdfs-mirroring/resources/runtime/hdfs-mirroring-workflow.xml",
"hdfs-snapshot-mirroring-template.xml", extensionStorePath
+ "/hdfs-mirroring/resources/runtime/hdfs-snapshot-mirroring-template.xml",
"hdfs-snapshot-mirroring-workflow.xml", extensionStorePath
+ "/hdfs-mirroring/resources/runtime/hdfs-snapshot-mirroring-workflow.xml"
);
fs = new JailedFileSystem();
initFileSystem();
}
@Test
public void testGetExtensionResources() throws StoreAccessException {
String extensionName = new HdfsMirroringExtension().getName();
Map<String, String> resources = store.getExtensionResources(extensionName);
for (Map.Entry<String, String> entry : resources.entrySet()) {
String path = resourcesMap.get(entry.getKey());
Assert.assertEquals(entry.getValue(), path);
}
}
@Test
public void testGetExtensionLibPath() throws StoreAccessException {
String extensionName = new HdfsMirroringExtension().getName();
String libPath = extensionStorePath + "/hdfs-mirroring/libs";
Assert.assertEquals(store.getExtensionLibPath(extensionName), libPath);
}
private static void initFileSystem() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", STORAGE_URL);
fs.initialize(LocalFileSystem.getDefaultUri(conf), conf);
}
@BeforeMethod
public void clean() {
clearDB();
// Clean up FS
try {
fs.delete(new Path(extensionStorePath + "/hdfs-mirroring"), true);
} catch (IOException e) {
// Ignore
}
}
@Test(expectedExceptions=ValidationException.class)
public void testFailureCaseRegisterExtensionForURL() throws IOException, URISyntaxException, FalconException{
store = ExtensionStore.get();
createLibs(EXTENSION_PATH);
store.registerExtension("test", EXTENSION_PATH, "test desc", "falconUser");
}
@Test
public void testRegisterExtension() throws IOException, URISyntaxException, FalconException {
String extensionPath = EXTENSION_PATH + "testRegister";
createLibs(extensionPath);
createReadmeAndJar(extensionPath);
createMETA(extensionPath);
store = ExtensionStore.get();
store.registerExtension("test", STORAGE_URL + extensionPath, "test desc", "falconUser");
ExtensionMetaStore metaStore = new ExtensionMetaStore();
Assert.assertEquals(metaStore.getAllExtensions().size(), 1);
}
@Test(expectedExceptions = ValidationException.class)
public void testFailureCaseRegisterExtension() throws IOException, URISyntaxException, FalconException {
String extensionPath = EXTENSION_PATH + "testRegister";
store = ExtensionStore.get();
createLibs(extensionPath);
store.registerExtension("test", STORAGE_URL + EXTENSION_PATH, "test desc", "falconUser");
}
@Test
public void testDeleteExtension() throws IOException, URISyntaxException, FalconException {
String extensionPath = EXTENSION_PATH + "testDelete";
createLibs(extensionPath);
createReadmeAndJar(extensionPath);
createMETA(extensionPath);
store = ExtensionStore.get();
store.registerExtension("toBeDeleted", STORAGE_URL + extensionPath, "test desc", "falconUser");
Assert.assertTrue(store.getResource("toBeDeleted", "README").equals("README"));
store.getResource("toBeDeleted", "README");
store.deleteExtension("toBeDeleted", "falconUser");
ExtensionMetaStore metaStore = new ExtensionMetaStore();
Assert.assertEquals(metaStore.getAllExtensions().size(), 0);
}
@Test(expectedExceptions = FalconException.class)
public void testFailureDeleteExtension() throws IOException, URISyntaxException, FalconException {
String extensionPath = EXTENSION_PATH + "testACLOnDelete";
createLibs(extensionPath);
createReadmeAndJar(extensionPath);
createMETA(extensionPath);
store = ExtensionStore.get();
store.registerExtension("ACLFailure", STORAGE_URL + extensionPath, "test desc", "oozieUser");
store.deleteExtension("ACLFailure", "falconUser");
}
private void createMETA(String extensionPath) throws IOException {
Path path = new Path(extensionPath + "/META");
if (fs.exists(path)) {
fs.delete(path, true);
}
fs.mkdirs(path);
path = new Path(extensionPath + "/META/test.properties");
OutputStream os = fs.create(path);
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
br.write("Hello World");
if (fs.exists(path)) {
fs.delete(path, true);
}
br.write("test properties");
fs.create(path);
br.close();
}
private void createLibs(String extensionPath) throws IOException {
Path path = new Path(extensionPath);
if (fs.exists(path)) {
fs.delete(path, true);
}
fs.mkdirs(path);
path = new Path(extensionPath + "/libs//libs/build");
fs.mkdirs(path);
}
private void createReadmeAndJar(String extensionPath) throws IOException {
Path path = new Path(extensionPath + "/README");
if (fs.exists(path)) {
fs.delete(path, true);
}
OutputStream os = fs.create(path);
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
br.write("README");
fs.create(path);
br.close();
os.close();
path = new Path(extensionPath + "/libs/build/test.jar");
os = fs.create(path);
br = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
br.write("Hello World");
br.write("test jar");
fs.create(path);
br.close();
os.close();
}
private void clearDB() {
EntityManager em = FalconJPAService.get().getEntityManager();
em.getTransaction().begin();
try {
Query query = em.createNativeQuery("delete from EXTENSIONS");
query.executeUpdate();
} finally {
em.getTransaction().commit();
em.close();
}
}
}