azkaban-uncached

bug fixes add metrics user for metrics permissions only for

10/17/2013 6:50:34 PM

Details

diff --git a/src/java/azkaban/executor/ExecutorManager.java b/src/java/azkaban/executor/ExecutorManager.java
index 5b9a95e..fd8a16c 100644
--- a/src/java/azkaban/executor/ExecutorManager.java
+++ b/src/java/azkaban/executor/ExecutorManager.java
@@ -96,151 +96,6 @@ public class ExecutorManager implements ExecutorManagerAdapter {
 		
 	}
 	
-//	private Map<String, Alerter> loadAlerters(Props props) {
-//		Map<String, Alerter> allAlerters = new HashMap<String, Alerter>();
-//		// load built-in alerters
-//		Emailer mailAlerter = new Emailer(props);
-//		allAlerters.put("email", mailAlerter);
-//		// load all plugin alerters
-//		String pluginDir = props.getString("alerter.plugin.dir", "plugins/alerter");
-//		allAlerters.putAll(loadPluginAlerters(pluginDir));
-//		return allAlerters;
-//	}
-
-//	private Map<String, Alerter> loadPluginAlerters(String pluginPath) {
-//		File alerterPluginPath = new File(pluginPath);
-//		if (!alerterPluginPath.exists()) {
-//			return Collections.<String, Alerter>emptyMap();
-//		}
-//			
-//		Map<String, Alerter> installedAlerterPlugins = new HashMap<String, Alerter>();
-//		ClassLoader parentLoader = this.getClass().getClassLoader();
-//		File[] pluginDirs = alerterPluginPath.listFiles();
-//		ArrayList<String> jarPaths = new ArrayList<String>();
-//		for (File pluginDir: pluginDirs) {
-//			if (!pluginDir.isDirectory()) {
-//				logger.error("The plugin path " + pluginDir + " is not a directory.");
-//				continue;
-//			}
-//			
-//			// Load the conf directory
-//			File propertiesDir = new File(pluginDir, "conf");
-//			Props pluginProps = null;
-//			if (propertiesDir.exists() && propertiesDir.isDirectory()) {
-//				File propertiesFile = new File(propertiesDir, "plugin.properties");
-//				File propertiesOverrideFile = new File(propertiesDir, "override.properties");
-//				
-//				if (propertiesFile.exists()) {
-//					if (propertiesOverrideFile.exists()) {
-//						pluginProps = PropsUtils.loadProps(null, propertiesFile, propertiesOverrideFile);
-//					}
-//					else {
-//						pluginProps = PropsUtils.loadProps(null, propertiesFile);
-//					}
-//				}
-//				else {
-//					logger.error("Plugin conf file " + propertiesFile + " not found.");
-//					continue;
-//				}
-//			}
-//			else {
-//				logger.error("Plugin conf path " + propertiesDir + " not found.");
-//				continue;
-//			}
-//			
-//			String pluginName = pluginProps.getString("alerter.name");
-//			List<String> extLibClasspath = pluginProps.getStringList("alerter.external.classpaths", (List<String>)null);
-//			
-//			String pluginClass = pluginProps.getString("alerter.class");
-//			if (pluginClass == null) {
-//				logger.error("Alerter class is not set.");
-//			}
-//			else {
-//				logger.info("Plugin class " + pluginClass);
-//			}
-//			
-//			URLClassLoader urlClassLoader = null;
-//			File libDir = new File(pluginDir, "lib");
-//			if (libDir.exists() && libDir.isDirectory()) {
-//				File[] files = libDir.listFiles();
-//				
-//				ArrayList<URL> urls = new ArrayList<URL>();
-//				for (int i=0; i < files.length; ++i) {
-//					try {
-//						URL url = files[i].toURI().toURL();
-//						urls.add(url);
-//					} catch (MalformedURLException e) {
-//						logger.error(e);
-//					}
-//				}
-//				if (extLibClasspath != null) {
-//					for (String extLib : extLibClasspath) {
-//						try {
-//							File file = new File(pluginDir, extLib);
-//							URL url = file.toURI().toURL();
-//							urls.add(url);
-//						} catch (MalformedURLException e) {
-//							logger.error(e);
-//						}
-//					}
-//				}
-//				
-//				urlClassLoader = new URLClassLoader(urls.toArray(new URL[urls.size()]), parentLoader);
-//			}
-//			else {
-//				logger.error("Library path " + propertiesDir + " not found.");
-//				continue;
-//			}
-//			
-//			Class<?> alerterClass = null;
-//			try {
-//				alerterClass = urlClassLoader.loadClass(pluginClass);
-//			}
-//			catch (ClassNotFoundException e) {
-//				logger.error("Class " + pluginClass + " not found.");
-//				continue;
-//			}
-//
-//			String source = FileIOUtils.getSourcePathFromClass(alerterClass);
-//			logger.info("Source jar " + source);
-//			jarPaths.add("jar:file:" + source);
-//			
-//			Constructor<?> constructor = null;
-//			try {
-//				constructor = alerterClass.getConstructor(Props.class);
-//			} catch (NoSuchMethodException e) {
-//				logger.error("Constructor not found in " + pluginClass);
-//				continue;
-//			}
-//			
-//			Object obj = null;
-//			try {
-//				obj = constructor.newInstance(pluginProps);
-//			} catch (Exception e) {
-//				logger.error(e);
-//			} 
-//			
-//			if (!(obj instanceof Alerter)) {
-//				logger.error("The object is not an Alerter");
-//				continue;
-//			}
-//			
-//			Alerter plugin = (Alerter) obj;
-//			installedAlerterPlugins.put(pluginName, plugin);
-//		}
-//		
-//		return installedAlerterPlugins;
-//		
-//	}
-
-//	private String getExecutorHost() {
-//		return executorHost;
-//	}
-//	
-//	private int getExecutorPort() {
-//		return executorPort;
-//	}
-	
 	@Override
 	public State getExecutorManagerThreadState() {
 		return executingManager.getState();
@@ -285,11 +140,6 @@ public class ExecutorManager implements ExecutorManagerAdapter {
 		return ports;
 	}
 	
-//	private ExecutableFlow fetchExecutableFlow(int execId) throws ExecutorManagerException {
-//		ExecutableFlow exflow = executorLoader.fetchExecutableFlow(execId);
-//		return exflow;
-//	}
-	
 	private void loadRunningFlows() throws ExecutorManagerException {
 		runningFlows.putAll(executorLoader.fetchActiveFlows());
 	}
diff --git a/src/java/azkaban/sla/SlaOption.java b/src/java/azkaban/sla/SlaOption.java
index 264a28c..e8f7a04 100644
--- a/src/java/azkaban/sla/SlaOption.java
+++ b/src/java/azkaban/sla/SlaOption.java
@@ -10,7 +10,6 @@ import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
 
 import azkaban.executor.ExecutableFlow;
-import azkaban.executor.ExecutorManagerException;
 
 public class SlaOption {
 	
diff --git a/src/java/azkaban/trigger/ActionTypeLoader.java b/src/java/azkaban/trigger/ActionTypeLoader.java
index 1a8b665..4ca9436 100644
--- a/src/java/azkaban/trigger/ActionTypeLoader.java
+++ b/src/java/azkaban/trigger/ActionTypeLoader.java
@@ -1,19 +1,11 @@
 package azkaban.trigger;
 
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import org.apache.log4j.Logger;
 
-import azkaban.trigger.builtin.ExecuteFlowAction;
 import azkaban.utils.Props;
 import azkaban.utils.Utils;
 
diff --git a/src/java/azkaban/trigger/builtin/SlaAlertAction.java b/src/java/azkaban/trigger/builtin/SlaAlertAction.java
index 82d69c5..ec8dd43 100644
--- a/src/java/azkaban/trigger/builtin/SlaAlertAction.java
+++ b/src/java/azkaban/trigger/builtin/SlaAlertAction.java
@@ -8,7 +8,6 @@ import org.apache.log4j.Logger;
 import azkaban.alert.Alerter;
 import azkaban.executor.ExecutableFlow;
 import azkaban.executor.ExecutorManagerAdapter;
-import azkaban.executor.ExecutorManagerException;
 import azkaban.sla.SlaOption;
 import azkaban.trigger.TriggerAction;
 
diff --git a/src/java/azkaban/trigger/builtin/SlaChecker.java b/src/java/azkaban/trigger/builtin/SlaChecker.java
index 0219eab..dedc23f 100644
--- a/src/java/azkaban/trigger/builtin/SlaChecker.java
+++ b/src/java/azkaban/trigger/builtin/SlaChecker.java
@@ -172,7 +172,6 @@ public class SlaChecker implements ConditionChecker{
 		return createFromJson((HashMap<String, Object>)obj);
 	}
 	
-	@SuppressWarnings("unchecked")
 	public static SlaChecker createFromJson(HashMap<String, Object> obj) throws Exception {
 		Map<String, Object> jsonObj = (HashMap<String, Object>) obj;
 		if(!jsonObj.get("type").equals(type)) {
diff --git a/src/java/azkaban/user/Permission.java b/src/java/azkaban/user/Permission.java
index 0405c6e..42158f8 100644
--- a/src/java/azkaban/user/Permission.java
+++ b/src/java/azkaban/user/Permission.java
@@ -29,6 +29,7 @@ public class Permission {
 		WRITE(0x0000002),
 		EXECUTE(0x0000004),
 		SCHEDULE(0x0000008),
+		METRICS(0x0000010),
 		CREATEPROJECTS(0x40000000), // Only used for roles
 		ADMIN(0x8000000);
 		
diff --git a/src/java/azkaban/webapp/AzkabanWebServer.java b/src/java/azkaban/webapp/AzkabanWebServer.java
index 1386215..e066be9 100644
--- a/src/java/azkaban/webapp/AzkabanWebServer.java
+++ b/src/java/azkaban/webapp/AzkabanWebServer.java
@@ -313,7 +313,7 @@ public class AzkabanWebServer extends AzkabanServer {
 		}
 			
 		Map<String, Alerter> installedAlerterPlugins = new HashMap<String, Alerter>();
-		ClassLoader parentLoader = SlaAlertAction.class.getClass().getClassLoader();
+		ClassLoader parentLoader = getClass().getClassLoader();
 		File[] pluginDirs = alerterPluginPath.listFiles();
 		ArrayList<String> jarPaths = new ArrayList<String>();
 		for (File pluginDir: pluginDirs) {
diff --git a/src/java/azkaban/webapp/servlet/JMXHttpServlet.java b/src/java/azkaban/webapp/servlet/JMXHttpServlet.java
index f85bf58..1a5d1d7 100644
--- a/src/java/azkaban/webapp/servlet/JMXHttpServlet.java
+++ b/src/java/azkaban/webapp/servlet/JMXHttpServlet.java
@@ -74,7 +74,7 @@ public class JMXHttpServlet extends LoginAbstractAzkabanServlet implements Conne
 		if (hasParam(req, "ajax")){
 			Map<String,Object> ret = new HashMap<String,Object>();
 
-			if(!hasAdminRole(session.getUser())) {
+			if(!hasPermission(session.getUser(), Permission.Type.METRICS)) {
 				ret.put("error", "User " + session.getUser().getUserId() + " has no permission.");
 				this.writeJSON(resp, ret, true);
 				return;
@@ -183,7 +183,7 @@ public class JMXHttpServlet extends LoginAbstractAzkabanServlet implements Conne
 	private void handleJMXPage(HttpServletRequest req, HttpServletResponse resp, Session session) throws IOException {
 		Page page = newPage(req, resp, session, "azkaban/webapp/servlet/velocity/jmxpage.vm");
 		
-		if(!hasAdminRole(session.getUser())) {
+		if(!hasPermission(session.getUser(), Permission.Type.METRICS)) {
 			page.add("errorMsg", "User " + session.getUser().getUserId() + " has no permission.");
 			page.render();
 			return;
@@ -241,11 +241,22 @@ public class JMXHttpServlet extends LoginAbstractAzkabanServlet implements Conne
 
 	}
 	
-	private boolean hasAdminRole(User user) {
+//	private boolean hasAdminRole(User user) {
+//		for(String roleName: user.getRoles()) {
+//			Role role = userManager.getRole(roleName);
+//			Permission perm = role.getPermission();
+//			if (perm.isPermissionSet(Permission.Type.ADMIN)) {
+//				return true;
+//			}
+//		}
+//		
+//		return false;
+//	}
+	
+	protected boolean hasPermission(User user, Permission.Type type) {	
 		for(String roleName: user.getRoles()) {
 			Role role = userManager.getRole(roleName);
-			Permission perm = role.getPermission();
-			if (perm.isPermissionSet(Permission.Type.ADMIN)) {
+			if (role.getPermission().isPermissionSet(type) || role.getPermission().isPermissionSet(Permission.Type.ADMIN)) {
 				return true;
 			}
 		}
diff --git a/src/package/soloserver/conf/azkaban-users.xml b/src/package/soloserver/conf/azkaban-users.xml
index b30da41..e19acc8 100644
--- a/src/package/soloserver/conf/azkaban-users.xml
+++ b/src/package/soloserver/conf/azkaban-users.xml
@@ -1,5 +1,7 @@
 <azkaban-users>
 	<user username="azkaban" password="azkaban" roles="admin" groups="azkaban" />
+	<user username="metrics" password="metrics" roles="metrics"/>
 	
 	<role name="admin" permissions="ADMIN" />
+	<role name="metrics" permissions="METRICS"/>
 </azkaban-users>
diff --git a/src/package/webserver/conf/azkaban-users.xml b/src/package/webserver/conf/azkaban-users.xml
index b30da41..e19acc8 100644
--- a/src/package/webserver/conf/azkaban-users.xml
+++ b/src/package/webserver/conf/azkaban-users.xml
@@ -1,5 +1,7 @@
 <azkaban-users>
 	<user username="azkaban" password="azkaban" roles="admin" groups="azkaban" />
+	<user username="metrics" password="metrics" roles="metrics"/>
 	
 	<role name="admin" permissions="ADMIN" />
+	<role name="metrics" permissions="METRICS"/>
 </azkaban-users>