/*
* Copyright 2014 LinkedIn Corp.
*
* Licensed 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 azkaban.jobtype;
import com.google.common.io.Resources;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.Rule;
import org.junit.rules.TemporaryFolder;
import static org.junit.Assert.*;
import azkaban.jobExecutor.Job;
import azkaban.utils.Props;
/**
* Test the flow run, especially with embedded flows. Files are in
* unit/plugins/jobtypes
*
*/
public class JobTypeManagerTest {
@Rule
public TemporaryFolder temp = new TemporaryFolder();
public final static String TEST_PLUGIN_DIR = "jobtypes_test";
private Logger logger = Logger.getLogger(JobTypeManagerTest.class);
private String testPluginDirPath;
private JobTypeManager manager;
public JobTypeManagerTest() {
}
@Before
public void setUp() throws Exception {
File jobTypeDir = temp.newFolder(TEST_PLUGIN_DIR);
testPluginDirPath = jobTypeDir.getCanonicalPath();
URL resourceUrl = Resources.getResource("plugins/jobtypes");
assertNotNull(resourceUrl);
FileUtils.copyDirectory(new File(resourceUrl.toURI()), jobTypeDir);
manager = new JobTypeManager(testPluginDirPath, null,
this.getClass().getClassLoader());
}
@After
public void tearDown() throws IOException {
temp.delete();
}
/**
* Tests that the common and common private properties are loaded correctly
*
* @throws Exception
*/
@Test
public void testCommonPluginProps() throws Exception {
JobTypePluginSet pluginSet = manager.getJobTypePluginSet();
Props props = pluginSet.getCommonPluginJobProps();
System.out.println(props.toString());
assertEquals("commonprop1", props.getString("commonprop1"));
assertEquals("commonprop2", props.getString("commonprop2"));
assertEquals("commonprop3", props.getString("commonprop3"));
Props priv = pluginSet.getCommonPluginLoadProps();
assertEquals("commonprivate1", priv.getString("commonprivate1"));
assertEquals("commonprivate2", priv.getString("commonprivate2"));
assertEquals("commonprivate3", priv.getString("commonprivate3"));
}
/**
* Tests that the proper classes were loaded and that the common and the load
* properties are properly loaded.
*
* @throws Exception
*/
@Test
public void testLoadedClasses() throws Exception {
JobTypePluginSet pluginSet = manager.getJobTypePluginSet();
Props props = pluginSet.getCommonPluginJobProps();
System.out.println(props.toString());
assertEquals("commonprop1", props.getString("commonprop1"));
assertEquals("commonprop2", props.getString("commonprop2"));
assertEquals("commonprop3", props.getString("commonprop3"));
assertNull(props.get("commonprivate1"));
Props priv = pluginSet.getCommonPluginLoadProps();
assertEquals("commonprivate1", priv.getString("commonprivate1"));
assertEquals("commonprivate2", priv.getString("commonprivate2"));
assertEquals("commonprivate3", priv.getString("commonprivate3"));
// Testing the anothertestjobtype
Class<? extends Job> aPluginClass =
pluginSet.getPluginClass("anothertestjob");
assertEquals("azkaban.jobtype.FakeJavaJob", aPluginClass.getName());
Props ajobProps = pluginSet.getPluginJobProps("anothertestjob");
Props aloadProps = pluginSet.getPluginLoaderProps("anothertestjob");
// Loader props
assertEquals("lib/*", aloadProps.get("jobtype.classpath"));
assertEquals("azkaban.jobtype.FakeJavaJob",
aloadProps.get("jobtype.class"));
assertEquals("commonprivate1", aloadProps.get("commonprivate1"));
assertEquals("commonprivate2", aloadProps.get("commonprivate2"));
assertEquals("commonprivate3", aloadProps.get("commonprivate3"));
// Job props
assertEquals("commonprop1", ajobProps.get("commonprop1"));
assertEquals("commonprop2", ajobProps.get("commonprop2"));
assertEquals("commonprop3", ajobProps.get("commonprop3"));
assertNull(ajobProps.get("commonprivate1"));
Class<? extends Job> tPluginClass = pluginSet.getPluginClass("testjob");
assertEquals("azkaban.jobtype.FakeJavaJob2", tPluginClass.getName());
Props tjobProps = pluginSet.getPluginJobProps("testjob");
Props tloadProps = pluginSet.getPluginLoaderProps("testjob");
// Loader props
assertNull(tloadProps.get("jobtype.classpath"));
assertEquals("azkaban.jobtype.FakeJavaJob2",
tloadProps.get("jobtype.class"));
assertEquals("commonprivate1", tloadProps.get("commonprivate1"));
assertEquals("commonprivate2", tloadProps.get("commonprivate2"));
assertEquals("private3", tloadProps.get("commonprivate3"));
assertEquals("0", tloadProps.get("testprivate"));
// Job props
assertEquals("commonprop1", tjobProps.get("commonprop1"));
assertEquals("commonprop2", tjobProps.get("commonprop2"));
assertEquals("1", tjobProps.get("pluginprops1"));
assertEquals("2", tjobProps.get("pluginprops2"));
assertEquals("3", tjobProps.get("pluginprops3"));
assertEquals("pluginprops", tjobProps.get("commonprop3"));
// Testing that the private properties aren't shared with the public ones
assertNull(tjobProps.get("commonprivate1"));
assertNull(tjobProps.get("testprivate"));
}
/**
* Test building classes
*
* @throws Exception
*/
@Test
public void testBuildClass() throws Exception {
Props jobProps = new Props();
jobProps.put("type", "anothertestjob");
jobProps.put("test", "test1");
jobProps.put("pluginprops3", "4");
Job job = manager.buildJobExecutor("anothertestjob", jobProps, logger);
assertTrue(job instanceof FakeJavaJob);
FakeJavaJob fjj = (FakeJavaJob) job;
Props props = fjj.getJobProps();
assertEquals("test1", props.get("test"));
assertNull(props.get("pluginprops1"));
assertEquals("4", props.get("pluginprops3"));
assertEquals("commonprop1", props.get("commonprop1"));
assertEquals("commonprop2", props.get("commonprop2"));
assertEquals("commonprop3", props.get("commonprop3"));
assertNull(props.get("commonprivate1"));
}
/**
* Test building classes 2
*
* @throws Exception
*/
@Test
public void testBuildClass2() throws Exception {
Props jobProps = new Props();
jobProps.put("type", "testjob");
jobProps.put("test", "test1");
jobProps.put("pluginprops3", "4");
Job job = manager.buildJobExecutor("testjob", jobProps, logger);
assertTrue(job instanceof FakeJavaJob2);
FakeJavaJob2 fjj = (FakeJavaJob2) job;
Props props = fjj.getJobProps();
assertEquals("test1", props.get("test"));
assertEquals("1", props.get("pluginprops1"));
assertEquals("2", props.get("pluginprops2"));
assertEquals("4", props.get("pluginprops3")); // Overridden value
assertEquals("commonprop1", props.get("commonprop1"));
assertEquals("commonprop2", props.get("commonprop2"));
assertEquals("pluginprops", props.get("commonprop3"));
assertNull(props.get("commonprivate1"));
}
/**
* Test out reloading properties
*
* @throws Exception
*/
@Test
public void testResetPlugins() throws Exception {
// Add a plugins file to the anothertestjob folder
File anothertestfolder = new File(testPluginDirPath + "/anothertestjob");
Props pluginProps = new Props();
pluginProps.put("test1", "1");
pluginProps.put("test2", "2");
pluginProps.put("pluginprops3", "4");
pluginProps
.storeFlattened(new File(anothertestfolder, "plugin.properties"));
// clone the testjob folder
File testFolder = new File(testPluginDirPath + "/testjob");
FileUtils.copyDirectory(testFolder, new File(testPluginDirPath
+ "/newtestjob"));
// change the common properties
Props commonPlugin =
new Props(null, testPluginDirPath + "/common.properties");
commonPlugin.put("commonprop1", "1");
commonPlugin.put("newcommonprop1", "2");
commonPlugin.removeLocal("commonprop2");
commonPlugin
.storeFlattened(new File(testPluginDirPath + "/common.properties"));
// change the common properties
Props commonPrivate =
new Props(null, testPluginDirPath + "/commonprivate.properties");
commonPrivate.put("commonprivate1", "1");
commonPrivate.put("newcommonprivate1", "2");
commonPrivate.removeLocal("commonprivate2");
commonPrivate.storeFlattened(new File(testPluginDirPath
+ "/commonprivate.properties"));
// change testjob private property
Props loadProps =
new Props(null, testPluginDirPath + "/testjob/private.properties");
loadProps.put("privatetest", "test");
// Reload the plugins here!!
manager.loadPlugins();
// Checkout common props
JobTypePluginSet pluginSet = manager.getJobTypePluginSet();
Props commonProps = pluginSet.getCommonPluginJobProps();
assertEquals("1", commonProps.get("commonprop1"));
assertEquals("commonprop3", commonProps.get("commonprop3"));
assertEquals("2", commonProps.get("newcommonprop1"));
assertNull(commonProps.get("commonprop2"));
// Checkout common private
Props commonPrivateProps = pluginSet.getCommonPluginLoadProps();
assertEquals("1", commonPrivateProps.get("commonprivate1"));
assertEquals("commonprivate3", commonPrivateProps.get("commonprivate3"));
assertEquals("2", commonPrivateProps.get("newcommonprivate1"));
assertNull(commonPrivateProps.get("commonprivate2"));
// Verify anothertestjob changes
Class<? extends Job> atjClass = pluginSet.getPluginClass("anothertestjob");
assertEquals("azkaban.jobtype.FakeJavaJob", atjClass.getName());
Props ajobProps = pluginSet.getPluginJobProps("anothertestjob");
assertEquals("1", ajobProps.get("test1"));
assertEquals("2", ajobProps.get("test2"));
assertEquals("4", ajobProps.get("pluginprops3"));
assertEquals("commonprop3", ajobProps.get("commonprop3"));
Props aloadProps = pluginSet.getPluginLoaderProps("anothertestjob");
assertEquals("1", aloadProps.get("commonprivate1"));
assertNull(aloadProps.get("commonprivate2"));
assertEquals("commonprivate3", aloadProps.get("commonprivate3"));
// Verify testjob changes
Class<? extends Job> tjClass = pluginSet.getPluginClass("testjob");
assertEquals("azkaban.jobtype.FakeJavaJob2", tjClass.getName());
Props tjobProps = pluginSet.getPluginJobProps("testjob");
assertEquals("1", tjobProps.get("commonprop1"));
assertEquals("2", tjobProps.get("newcommonprop1"));
assertEquals("1", tjobProps.get("pluginprops1"));
assertEquals("2", tjobProps.get("pluginprops2"));
assertEquals("3", tjobProps.get("pluginprops3"));
assertEquals("pluginprops", tjobProps.get("commonprop3"));
assertNull(tjobProps.get("commonprop2"));
Props tloadProps = pluginSet.getPluginLoaderProps("testjob");
assertNull(tloadProps.get("jobtype.classpath"));
assertEquals("azkaban.jobtype.FakeJavaJob2",
tloadProps.get("jobtype.class"));
assertEquals("1", tloadProps.get("commonprivate1"));
assertNull(tloadProps.get("commonprivate2"));
assertEquals("private3", tloadProps.get("commonprivate3"));
// Verify newtestjob
Class<? extends Job> ntPluginClass = pluginSet.getPluginClass("newtestjob");
assertEquals("azkaban.jobtype.FakeJavaJob2", ntPluginClass.getName());
Props ntjobProps = pluginSet.getPluginJobProps("newtestjob");
Props ntloadProps = pluginSet.getPluginLoaderProps("newtestjob");
// Loader props
assertNull(ntloadProps.get("jobtype.classpath"));
assertEquals("azkaban.jobtype.FakeJavaJob2",
ntloadProps.get("jobtype.class"));
assertEquals("1", ntloadProps.get("commonprivate1"));
assertNull(ntloadProps.get("commonprivate2"));
assertEquals("private3", ntloadProps.get("commonprivate3"));
assertEquals("0", ntloadProps.get("testprivate"));
// Job props
assertEquals("1", ntjobProps.get("commonprop1"));
assertNull(ntjobProps.get("commonprop2"));
assertEquals("1", ntjobProps.get("pluginprops1"));
assertEquals("2", ntjobProps.get("pluginprops2"));
assertEquals("3", ntjobProps.get("pluginprops3"));
assertEquals("pluginprops", ntjobProps.get("commonprop3"));
}
}