You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myriad.apache.org by da...@apache.org on 2016/07/12 18:51:42 UTC
[2/2] incubator-myriad git commit: MYRIAD-200
MYRIAD-200
Increase JUnit Test Coverage
JIRA:
[MYRIAD-200] https://issues.apache.org/jira/browse/MYRIAD-200
Pull Request:
Closes #78
Author: hokiegeek2 <ho...@gmail.com>
Project: http://git-wip-us.apache.org/repos/asf/incubator-myriad/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-myriad/commit/4a6e50c4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-myriad/tree/4a6e50c4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-myriad/diff/4a6e50c4
Branch: refs/heads/master
Commit: 4a6e50c41ce3098a393c96ff8f55f9d4eb78b390
Parents: 6354ce6
Author: hokiegeek2 <ho...@gmail.com>
Authored: Thu Jun 9 15:03:24 2016 -0400
Committer: darinj <da...@apache.org>
Committed: Tue Jul 12 14:48:32 2016 -0400
----------------------------------------------------------------------
.../myriad/executor/MyriadExecutorDefaults.java | 6 +-
.../apache/myriad/executor/NMTaskConfig.java | 2 +-
.../recovery/MyriadFileSystemRMStateStore.java | 5 +-
.../src/main/java/org/apache/myriad/Main.java | 30 +-
.../java/org/apache/myriad/MyriadModule.java | 22 +-
.../apache/myriad/health/HealthCheckUtils.java | 39 ++-
.../scheduler/ExtendedResourceProfile.java | 47 ++-
.../org/apache/myriad/scheduler/NMProfile.java | 47 ++-
.../myriad/scheduler/NMProfileManager.java | 25 +-
.../scheduler/ServiceResourceProfile.java | 96 +++++-
.../scheduler/event/OfferRescindedEvent.java | 6 +-
.../handlers/OfferRescindedEventHandler.java | 5 +-
.../event/handlers/SlaveLostEventHandler.java | 1 +
.../scheduler/fgs/OfferLifecycleManager.java | 9 +
.../java/org/apache/myriad/state/Cluster.java | 4 +
.../java/org/apache/myriad/state/NodeTask.java | 15 +-
.../myriad/state/utils/ByteBufferSupport.java | 27 +-
.../apache/myriad/webapp/MyriadWebServer.java | 21 +-
.../MyriadFileSystemRMStateStoreTest.java | 69 ++++
.../org/apache/myriad/BaseConfigurableTest.java | 35 ++
.../org/apache/myriad/MultiBindingsTest.java | 33 +-
.../org/apache/myriad/TestObjectFactory.java | 90 +++++
.../myriad/api/ArtifactsResourceTest.java | 51 +++
.../myriad/api/SchedulerStateResourceTest.java | 58 ++++
.../configuration/MyriadConfigurationTest.java | 95 +++---
.../myriad/health/HealthCheckUtilsTest.java | 27 ++
.../health/MesosDriverHealthCheckTest.java | 69 ++++
.../myriad/scheduler/MockSchedulerDriver.java | 124 +++++++
.../myriad/scheduler/MyriadDriverTest.java | 43 +++
.../myriad/scheduler/MyriadOperationsTest.java | 112 ++++++
.../myriad/scheduler/NMProfileManagerTest.java | 63 ++++
.../scheduler/ServiceResourceProfileTest.java | 31 ++
.../scheduler/TaskConstraintsManagerTest.java | 32 ++
.../scheduler/TestServiceCommandLine.java | 27 +-
.../apache/myriad/scheduler/TestTaskUtils.java | 41 +--
.../fgs/OfferLifeCycleManagerTest.java | 54 +++
.../myriad/scheduler/fgs/OfferUtilsTest.java | 74 ++++
.../org/apache/myriad/state/ClusterTest.java | 62 ++++
.../org/apache/myriad/state/MockDispatcher.java | 32 ++
.../org/apache/myriad/state/MockFuture.java | 44 +++
.../java/org/apache/myriad/state/MockRMApp.java | 202 +++++++++++
.../org/apache/myriad/state/MockRMContext.java | 339 +++++++++++++++++++
.../java/org/apache/myriad/state/MockState.java | 45 +++
.../org/apache/myriad/state/MockVariable.java | 35 ++
.../apache/myriad/state/MyriadStateTest.java | 21 ++
.../org/apache/myriad/state/NodeTaskTest.java | 40 +++
.../apache/myriad/state/SchedulerStateTest.java | 65 ++++
.../state/utils/ByteBufferSupportTest.java | 184 ++++++++++
.../webapp/HttpConnectorProviderTest.java | 22 ++
.../myriad/webapp/MyriadWebServerTest.java | 29 ++
.../resources/myriad-config-test-default.yml | 7 +-
51 files changed, 2455 insertions(+), 207 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-commons/src/main/java/org/apache/myriad/executor/MyriadExecutorDefaults.java
----------------------------------------------------------------------
diff --git a/myriad-commons/src/main/java/org/apache/myriad/executor/MyriadExecutorDefaults.java b/myriad-commons/src/main/java/org/apache/myriad/executor/MyriadExecutorDefaults.java
index bda7ff0..c7e4515 100644
--- a/myriad-commons/src/main/java/org/apache/myriad/executor/MyriadExecutorDefaults.java
+++ b/myriad-commons/src/main/java/org/apache/myriad/executor/MyriadExecutorDefaults.java
@@ -69,9 +69,7 @@ public class MyriadExecutorDefaults {
public static final double DEFAULT_JVM_MAX_MEMORY_MB = 256;
/**
- * Default cpus for executor JVM.
+ * Default CPU cores for executor JVM.
*/
public static final double DEFAULT_CPUS = 0.2;
-
-
-}
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-commons/src/main/java/org/apache/myriad/executor/NMTaskConfig.java
----------------------------------------------------------------------
diff --git a/myriad-commons/src/main/java/org/apache/myriad/executor/NMTaskConfig.java b/myriad-commons/src/main/java/org/apache/myriad/executor/NMTaskConfig.java
index 21d2420..1b250ec 100644
--- a/myriad-commons/src/main/java/org/apache/myriad/executor/NMTaskConfig.java
+++ b/myriad-commons/src/main/java/org/apache/myriad/executor/NMTaskConfig.java
@@ -21,7 +21,7 @@ package org.apache.myriad.executor;
import java.util.Map;
/**
- * Node Manger Task Configuraiton
+ * Node Manger Task Configuration
*/
public class NMTaskConfig {
private String yarnHome;
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStore.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStore.java b/myriad-scheduler/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStore.java
index 923e29d..6257ffc 100644
--- a/myriad-scheduler/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStore.java
+++ b/myriad-scheduler/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStore.java
@@ -32,6 +32,8 @@ import org.apache.myriad.state.utils.StoreContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.annotations.VisibleForTesting;
+
/**
* StateStore that stores Myriad state in addition to RM state to DFS.
*/
@@ -70,6 +72,7 @@ public class MyriadFileSystemRMStateStore extends FileSystemRMStateStore impleme
return null;
}
+ @VisibleForTesting
@Override
protected synchronized void startInternal() throws Exception {
super.startInternal();
@@ -120,7 +123,7 @@ public class MyriadFileSystemRMStateStore extends FileSystemRMStateStore impleme
protected void reflectedUpdateFile(Path outputPath, byte[] data) throws InvocationTargetException, IllegalAccessException {
- Class [] parameters = updateFileMethod.getParameterTypes();
+ Class<?> [] parameters = updateFileMethod.getParameterTypes();
if (parameters.length == 2 && parameters[0].equals(Path.class) && parameters[1].isArray()) {
updateFileMethod.invoke(this, outputPath, data);
} else if (parameters.length == 3 && parameters[0].equals(Path.class) && parameters[1].isArray() && parameters[2].isPrimitive()) {
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/Main.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/Main.java b/myriad-scheduler/src/main/java/org/apache/myriad/Main.java
index e825256..14ab806 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/Main.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/Main.java
@@ -18,19 +18,13 @@
*/
package org.apache.myriad;
-import com.codahale.metrics.JmxReporter;
-import com.codahale.metrics.MetricRegistry;
-import com.codahale.metrics.health.HealthCheckRegistry;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
+
import org.apache.commons.collections.MapUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
@@ -61,6 +55,12 @@ import org.apache.myriad.webapp.WebAppGuiceModule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.codahale.metrics.JmxReporter;
+import com.codahale.metrics.MetricRegistry;
+import com.codahale.metrics.health.HealthCheckRegistry;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+
/**
* Main entry point for myriad scheduler
*/
@@ -76,18 +76,14 @@ public class Main {
private static Injector injector;
public static void initialize(Configuration hadoopConf, AbstractYarnScheduler yarnScheduler, RMContext rmContext,
- InterceptorRegistry registry) throws Exception {
- ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
- MyriadConfiguration cfg = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource(
- "myriad-config-default.yml"), MyriadConfiguration.class);
-
- MyriadModule myriadModule = new MyriadModule(cfg, hadoopConf, yarnScheduler, rmContext, registry);
+ InterceptorRegistry registry) throws Exception {
+ MyriadModule myriadModule = new MyriadModule("myriad-config-default.yml", hadoopConf, yarnScheduler, rmContext, registry);
MesosModule mesosModule = new MesosModule();
injector = Guice.createInjector(myriadModule, mesosModule, new WebAppGuiceModule());
- new Main().run(cfg);
+ new Main().run(injector.getInstance(MyriadConfiguration.class));
}
-
+
// TODO (Kannan Rajah) Hack to get injector in unit test.
public static Injector getInjector() {
return injector;
@@ -158,10 +154,8 @@ public class Main {
Long cpu = Long.parseLong(profileResourceMap.get("cpu"));
Long mem = Long.parseLong(profileResourceMap.get("mem"));
- ServiceResourceProfile serviceProfile = new ExtendedResourceProfile(new NMProfile(profile.getKey(), cpu, mem),
+ ServiceResourceProfile serviceProfile = new ExtendedResourceProfile(new NMProfile(profile.getKey(), cpu, mem), taskUtils.getExecutorCpus(), taskUtils.getExecutorMemory(),
taskUtils.getNodeManagerCpus(), taskUtils.getNodeManagerMemory());
- serviceProfile.setExecutorCpu(taskUtils.getExecutorCpus());
- serviceProfile.setExecutorMemory(taskUtils.getExecutorMemory());
profileManager.add(serviceProfile);
} else {
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/MyriadModule.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/MyriadModule.java b/myriad-scheduler/src/main/java/org/apache/myriad/MyriadModule.java
index 92add9a..8748dcb 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/MyriadModule.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/MyriadModule.java
@@ -18,11 +18,15 @@
*/
package org.apache.myriad;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Scopes;
import com.google.inject.Singleton;
import com.google.inject.multibindings.MapBinder;
+
+import java.io.IOException;
import java.util.Map;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
@@ -68,15 +72,15 @@ public class MyriadModule extends AbstractModule {
private final RMContext rmContext;
private InterceptorRegistry interceptorRegistry;
- public MyriadModule(MyriadConfiguration cfg, Configuration hadoopConf, AbstractYarnScheduler yarnScheduler, RMContext rmContext,
+ public MyriadModule(String configFile, Configuration hadoopConf, AbstractYarnScheduler yarnScheduler, RMContext rmContext,
InterceptorRegistry interceptorRegistry) {
- this.cfg = cfg;
+ this.cfg = this.generateMyriadConfiguration(configFile);
this.hadoopConf = hadoopConf;
this.yarnScheduler = yarnScheduler;
this.rmContext = rmContext;
this.interceptorRegistry = interceptorRegistry;
}
-
+
@Override
protected void configure() {
LOGGER.debug("Configuring guice");
@@ -168,4 +172,16 @@ public class MyriadModule extends AbstractModule {
}
return cliGenerator;
}
+
+ protected MyriadConfiguration generateMyriadConfiguration(String configFile) {
+ ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
+
+ try {
+ return mapper.readValue(Thread.currentThread().getContextClassLoader().getResource(
+ configFile), MyriadConfiguration.class);
+ } catch (IOException e) {
+ LOGGER.error("The configFile {} could not be found", configFile);
+ throw new IllegalArgumentException("The configFile cannot be found", e);
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/health/HealthCheckUtils.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/health/HealthCheckUtils.java b/myriad-scheduler/src/main/java/org/apache/myriad/health/HealthCheckUtils.java
index 8abbb57..75ac1f6 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/health/HealthCheckUtils.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/health/HealthCheckUtils.java
@@ -20,6 +20,8 @@ package org.apache.myriad.health;
import java.io.IOException;
import java.net.Socket;
+
+import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -30,15 +32,34 @@ public class HealthCheckUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(HealthCheckUtils.class);
public static boolean checkHostPort(String connectionString) {
- String[] split = connectionString.split(":");
- String serverAddress = split[0];
- Integer serverPort = Integer.valueOf(split[1]);
- try (Socket s = new Socket(serverAddress, serverPort)) {
+ String[] hostPort = generateHostPortArray(connectionString);
+
+ try {
+ createSocket(hostPort);
return true;
- } catch (IOException ex) {
- LOGGER.error("parsing host port", ex);
- }
-
+ } catch (IOException e) {
+ LOGGER.error("error in connecting to " + hostPort[0] + ":" + hostPort[1], e);
+ }
+
return false;
}
-}
+
+ private static void createSocket(String[] hostPort) throws IOException {
+ String address = hostPort[0];
+ Integer port = Integer.valueOf(hostPort[1]);
+
+ Socket s = new Socket(address, port);
+ s.close();
+ }
+
+ private static String[] generateHostPortArray(String connectionString) {
+ String[] split = connectionString.split(":");
+ if (split.length != 2) {
+ throw new IllegalArgumentException("The Connection String " + connectionString + " is invalid. It must be in <host>:<port> format");
+ } else if (!StringUtils.isNumeric(split[1])) {
+ throw new IllegalArgumentException("The Connection String " + connectionString + " is invalid. The port must be an integer");
+ } else {
+ return split;
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ExtendedResourceProfile.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ExtendedResourceProfile.java b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ExtendedResourceProfile.java
index 8119360..6232258 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ExtendedResourceProfile.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ExtendedResourceProfile.java
@@ -33,8 +33,21 @@ public class ExtendedResourceProfile extends ServiceResourceProfile {
* @param cpu
* @param mem will throw NullPoiterException if childProfile is null
*/
+ public ExtendedResourceProfile(NMProfile childProfile, Double cpu, Double mem, Double execCpu, Double execMemory) {
+ super(childProfile.getName(), cpu, mem, execCpu, execMemory);
+
+ this.childProfile = childProfile;
+ this.className = ExtendedResourceProfile.class.getName();
+ }
+
+ /**
+ * @param childProfile - should be null
+ * @param cpu
+ * @param mem will throw NullPoiterException if childProfile is null
+ */
public ExtendedResourceProfile(NMProfile childProfile, Double cpu, Double mem) {
super(childProfile.getName(), cpu, mem);
+
this.childProfile = childProfile;
this.className = ExtendedResourceProfile.class.getName();
}
@@ -77,4 +90,36 @@ public class ExtendedResourceProfile extends ServiceResourceProfile {
Gson gson = new Gson();
return gson.toJson(this);
}
-}
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((childProfile == null) ? 0 : childProfile.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!super.equals(obj)) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+
+ ExtendedResourceProfile other = (ExtendedResourceProfile) obj;
+
+ if (childProfile == null) {
+ if (other.childProfile != null) {
+ return false;
+ }
+ } else if (!childProfile.equals(other.childProfile)) {
+ return false;
+ }
+ return true;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfile.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfile.java b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfile.java
index 3de82a5..2215835 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfile.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfile.java
@@ -60,4 +60,49 @@ public class NMProfile {
return gson.toJson(this);
}
-}
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((cpus == null) ? 0 : cpus.hashCode());
+ result = prime * result + ((memory == null) ? 0 : memory.hashCode());
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ NMProfile other = (NMProfile) obj;
+ if (cpus == null) {
+ if (other.cpus != null) {
+ return false;
+ }
+ } else if (!cpus.equals(other.cpus)) {
+ return false;
+ }
+ if (memory == null) {
+ if (other.memory != null) {
+ return false;
+ }
+ } else if (!memory.equals(other.memory)) {
+ return false;
+ }
+ if (name == null) {
+ if (other.name != null) {
+ return false;
+ }
+ } else if (!name.equals(other.name)) {
+ return false;
+ }
+ return true;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfileManager.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfileManager.java b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfileManager.java
index 4256f40..285de5d 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfileManager.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/NMProfileManager.java
@@ -18,14 +18,16 @@
*/
package org.apache.myriad.scheduler;
-import com.google.gson.Gson;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
- * Node Manager Profile Manager
+ * NMProfile Manager
*/
public class NMProfileManager {
private static final Logger LOGGER = LoggerFactory.getLogger(NMProfileManager.class);
@@ -46,8 +48,21 @@ public class NMProfileManager {
return this.profiles.containsKey(name);
}
+ public int numberOfProfiles() {
+ return profiles.size();
+ }
+
+ @Override
public String toString() {
- Gson gson = new Gson();
- return gson.toJson(this);
+ ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.JSON_STYLE);
+
+ for (Map.Entry<String, NMProfile> profile : profiles.entrySet()) {
+ NMProfile value = profile.getValue();
+ builder.append("name", value.getName());
+ builder.append("cpus", value.getCpus());
+ builder.append("memory", value.getMemory());
+ }
+
+ return builder.toString();
}
-}
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ServiceResourceProfile.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ServiceResourceProfile.java b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ServiceResourceProfile.java
index 4c033c9..146a80c 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ServiceResourceProfile.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/ServiceResourceProfile.java
@@ -28,7 +28,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
- * Resource Profile for any service
+ * Resource Profile for any service
*/
public class ServiceResourceProfile {
@@ -48,15 +48,21 @@ public class ServiceResourceProfile {
protected Double executorMemory = 0.0;
- protected String className;
+ protected String className = ServiceResourceProfile.class.getName();
- public ServiceResourceProfile(String name, Double cpu, Double mem) {
+ public ServiceResourceProfile(String name, Double cpus, Double mem) {
this.name = name;
- this.cpus = cpu;
+ this.cpus = cpus;
this.memory = mem;
- this.className = ServiceResourceProfile.class.getName();
}
+ public ServiceResourceProfile(String name, Double cpus, Double mem, Double execCpus, Double execMemory) {
+ this.name = name;
+ this.cpus = cpus;
+ this.memory = mem;
+ this.executorCpu = execCpus;
+ this.executorMemory = execMemory;
+ }
public String getName() {
return name;
@@ -82,19 +88,10 @@ public class ServiceResourceProfile {
return executorCpu;
}
- public void setExecutorCpu(Double executorCpu) {
- this.executorCpu = executorCpu;
- }
-
public Double getExecutorMemory() {
return executorMemory;
}
- public void setExecutorMemory(Double executorMemory) {
- this.executorMemory = executorMemory;
- }
-
-
@Override
public String toString() {
Gson gson = new Gson();
@@ -125,6 +122,75 @@ public class ServiceResourceProfile {
}
return null;
}
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((className == null) ? 0 : className.hashCode());
+ result = prime * result + ((cpus == null) ? 0 : cpus.hashCode());
+ result = prime * result + ((executorCpu == null) ? 0 : executorCpu.hashCode());
+ result = prime * result + ((executorMemory == null) ? 0 : executorMemory.hashCode());
+ result = prime * result + ((memory == null) ? 0 : memory.hashCode());
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ ServiceResourceProfile other = (ServiceResourceProfile) obj;
+ if (className == null) {
+ if (other.className != null) {
+ return false;
+ }
+ } else if (!className.equals(other.className)) {
+ return false;
+ }
+ if (cpus == null) {
+ if (other.cpus != null) {
+ return false;
+ }
+ } else if (!cpus.equals(other.cpus)) {
+ return false;
+ }
+ if (executorCpu == null) {
+ if (other.executorCpu != null) {
+ return false;
+ }
+ } else if (!executorCpu.equals(other.executorCpu)) {
+ return false;
+ }
+ if (executorMemory == null) {
+ if (other.executorMemory != null) {
+ return false;
+ }
+ } else if (!executorMemory.equals(other.executorMemory)) {
+ return false;
+ }
+ if (memory == null) {
+ if (other.memory != null) {
+ return false;
+ }
+ } else if (!memory.equals(other.memory)) {
+ return false;
+ }
+ if (name == null) {
+ if (other.name != null) {
+ return false;
+ }
+ } else if (!name.equals(other.name)) {
+ return false;
+ }
+ return true;
}
-}
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/OfferRescindedEvent.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/OfferRescindedEvent.java b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/OfferRescindedEvent.java
index 180655c..126cfb8 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/OfferRescindedEvent.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/OfferRescindedEvent.java
@@ -44,4 +44,8 @@ public class OfferRescindedEvent {
this.offerId = offerId;
}
-}
+ @Override
+ public String toString() {
+ return "OfferRescindedEvent [driver=" + driver + ", offerId=" + offerId + "]";
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/OfferRescindedEventHandler.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/OfferRescindedEventHandler.java b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/OfferRescindedEventHandler.java
index 85e8043..e49d2b9 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/OfferRescindedEventHandler.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/OfferRescindedEventHandler.java
@@ -31,7 +31,6 @@ public class OfferRescindedEventHandler implements EventHandler<OfferRescindedEv
@Override
public void onEvent(OfferRescindedEvent event, long sequence, boolean endOfBatch) throws Exception {
- LOGGER.info("OfferRescinded event: {}", event);
+ LOGGER.info("OfferRescindedEvent for offer id: {} for scheuler {}", event.getOfferId().toString(), event.getDriver().getClass().getName());
}
-
-}
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/SlaveLostEventHandler.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/SlaveLostEventHandler.java b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/SlaveLostEventHandler.java
index b1f37bb..9e17f6c 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/SlaveLostEventHandler.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/event/handlers/SlaveLostEventHandler.java
@@ -30,6 +30,7 @@ import org.slf4j.LoggerFactory;
public class SlaveLostEventHandler implements EventHandler<SlaveLostEvent> {
private static final Logger LOGGER = LoggerFactory.getLogger(SlaveLostEventHandler.class);
+ //TODO (hokiegeek2) Research how else Myriad should respond to this event
@Override
public void onEvent(SlaveLostEvent event, long sequence, boolean endOfBatch) throws Exception {
SlaveID slaveId = event.getSlaveId();
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/fgs/OfferLifecycleManager.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/fgs/OfferLifecycleManager.java b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/fgs/OfferLifecycleManager.java
index 135158f..e4cec83 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/fgs/OfferLifecycleManager.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/scheduler/fgs/OfferLifecycleManager.java
@@ -21,13 +21,17 @@ package org.apache.myriad.scheduler.fgs;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+
import javax.inject.Inject;
+
import org.apache.mesos.Protos;
import org.apache.mesos.Protos.Offer;
import org.apache.myriad.scheduler.MyriadDriver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.annotations.VisibleForTesting;
+
/**
* Manages the Mesos offers tracked by Myriad.
*/
@@ -110,4 +114,9 @@ public class OfferLifecycleManager {
LOGGER.info("Declined {} outstanding offers for host {}", numOutStandingOffers, hostname);
}
}
+
+ @VisibleForTesting
+ public ConsumedOffer getConsumedOffer(String hostname) {
+ return consumedOfferMap.get(hostname);
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/state/Cluster.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/state/Cluster.java b/myriad-scheduler/src/main/java/org/apache/myriad/state/Cluster.java
index a5ccca7..2586720 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/state/Cluster.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/state/Cluster.java
@@ -66,6 +66,10 @@ public class Cluster {
public void removeNode(NodeTask task) {
this.nodes.remove(task);
}
+
+ public void removeAllNodes() {
+ this.nodes.clear();
+ }
public String getResourceManagerHost() {
return resourceManagerHost;
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/state/NodeTask.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/state/NodeTask.java b/myriad-scheduler/src/main/java/org/apache/myriad/state/NodeTask.java
index 3a4ee56..5acd7cb 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/state/NodeTask.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/state/NodeTask.java
@@ -21,6 +21,8 @@ package org.apache.myriad.state;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.inject.Inject;
import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
import org.apache.mesos.Protos;
import org.apache.mesos.Protos.Attribute;
import org.apache.myriad.scheduler.ServiceResourceProfile;
@@ -32,7 +34,7 @@ import org.apache.myriad.scheduler.constraints.Constraint;
*/
public class NodeTask {
@JsonProperty
- private String hostname;
+ private String hostname = StringUtils.EMPTY;
@JsonProperty
private Protos.SlaveID slaveId;
@JsonProperty
@@ -40,21 +42,22 @@ public class NodeTask {
@JsonProperty
private String taskPrefix;
@JsonProperty
- private ServiceResourceProfile serviceresourceProfile;
+ private ServiceResourceProfile profile;
@Inject
TaskUtils taskUtils;
+
/**
* Mesos executor for this node.
*/
private Protos.ExecutorInfo executorInfo;
private Constraint constraint;
+
private List<Attribute> slaveAttributes;
public NodeTask(ServiceResourceProfile profile, Constraint constraint) {
- this.serviceresourceProfile = profile;
- this.hostname = "";
+ this.profile = profile;
this.constraint = constraint;
}
@@ -111,10 +114,10 @@ public class NodeTask {
}
public ServiceResourceProfile getProfile() {
- return serviceresourceProfile;
+ return profile;
}
public void setProfile(ServiceResourceProfile serviceresourceProfile) {
- this.serviceresourceProfile = serviceresourceProfile;
+ this.profile = serviceresourceProfile;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/state/utils/ByteBufferSupport.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/state/utils/ByteBufferSupport.java b/myriad-scheduler/src/main/java/org/apache/myriad/state/utils/ByteBufferSupport.java
index b473b9e..9b0e643 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/state/utils/ByteBufferSupport.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/state/utils/ByteBufferSupport.java
@@ -28,6 +28,9 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.mesos.Protos;
import org.apache.myriad.scheduler.ServiceResourceProfile;
@@ -50,7 +53,7 @@ public class ByteBufferSupport {
public static void addByteBuffers(List<ByteBuffer> list, ByteArrayOutputStream bytes) throws IOException {
// If list, add the list size, then the size of each buffer followed by the buffer.
- if (list != null) {
+ if (CollectionUtils.isNotEmpty(list)) {
bytes.write(toIntBytes(list.size()));
for (ByteBuffer bb : list) {
addByteBuffer(bb, bytes);
@@ -61,7 +64,7 @@ public class ByteBufferSupport {
}
public static void addByteBuffer(ByteBuffer bb, ByteArrayOutputStream bytes) throws IOException {
- if (bb != null && bytes != null) {
+ if (byteBufferNotEmpty(bb)) {
bytes.write(toIntBytes(bb.array().length));
bytes.write(bb.array());
}
@@ -199,16 +202,21 @@ public class ByteBufferSupport {
*/
public static NodeTask toNodeTask(ByteBuffer bb) {
NodeTask nt = null;
- if (bb != null && bb.array().length > 0) {
+ if (byteBufferNotEmpty(bb)) {
nt = new NodeTask(getServiceResourceProfile(bb), getConstraint(bb));
nt.setHostname(toString(bb));
nt.setSlaveId(toSlaveId(bb));
nt.setTaskStatus(toTaskStatus(bb));
nt.setExecutorInfo(toExecutorInfo(bb));
+ nt.setTaskPrefix(toString(bb));
}
return nt;
}
+ private static boolean byteBufferNotEmpty(ByteBuffer bb) {
+ return bb != null && bb.array().length > 0;
+ }
+
public static byte[] getTaskBytes(NodeTask nt) {
if (nt.getTaskStatus() != null) {
return nt.getTaskStatus().toByteArray();
@@ -234,7 +242,7 @@ public class ByteBufferSupport {
}
public static void putBytes(ByteBuffer bb, byte bytes[]) {
- if (bytes != null && bytes.length > 0) {
+ if (ArrayUtils.isNotEmpty(bytes)) {
bb.putInt(bytes.length);
bb.put(bytes);
} else {
@@ -250,7 +258,7 @@ public class ByteBufferSupport {
/**
* This assumes the next position is the size as an int, and the following is a string
- * iff the size is not zero.
+ * if the size is not zero.
*
* @param bb ByteBuffer to extract string from
* @return string from the next position, or "" if the size is zero
@@ -259,7 +267,7 @@ public class ByteBufferSupport {
byte[] bytes = new byte[bb.getInt()];
String s = "";
try {
- if (bytes.length > 0) {
+ if (ArrayUtils.isNotEmpty(bytes)) {
bb.get(bytes);
s = new String(bytes, UTF8);
}
@@ -279,7 +287,7 @@ public class ByteBufferSupport {
public static ServiceResourceProfile getServiceResourceProfile(ByteBuffer bb) {
String p = toString(bb);
- if (!StringUtils.isEmpty(p)) {
+ if (StringUtils.isNotEmpty(p)) {
return gsonCustom.fromJson(p, ServiceResourceProfile.class);
} else {
return null;
@@ -295,7 +303,7 @@ public class ByteBufferSupport {
case LIKE:
- if (!StringUtils.isEmpty(p)) {
+ if (StringUtils.isNotEmpty(p)) {
return gson.fromJson(p, LikeConstraint.class);
}
}
@@ -363,5 +371,4 @@ public class ByteBufferSupport {
public static ByteBuffer createBuffer(ByteBuffer bb) {
return fillBuffer(getBytes(bb, bb.getInt()));
}
-
-}
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/main/java/org/apache/myriad/webapp/MyriadWebServer.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/main/java/org/apache/myriad/webapp/MyriadWebServer.java b/myriad-scheduler/src/main/java/org/apache/myriad/webapp/MyriadWebServer.java
index 126febc..60ef87d 100644
--- a/myriad-scheduler/src/main/java/org/apache/myriad/webapp/MyriadWebServer.java
+++ b/myriad-scheduler/src/main/java/org/apache/myriad/webapp/MyriadWebServer.java
@@ -37,6 +37,11 @@ public class MyriadWebServer {
private final Connector connector;
private final GuiceFilter filter;
+ /**
+ * Status codes for MyriadWebServer
+ */
+ public enum Status {STARTED, RUNNING, STOPPED, FAILED, UNKNOWN}
+
@Inject
public MyriadWebServer(Server jetty, Connector connector, GuiceFilter filter) {
this.jetty = jetty;
@@ -71,8 +76,22 @@ public class MyriadWebServer {
this.jetty.start();
}
+ public Status getStatus() {
+ if (jetty.isFailed()) {
+ return Status.FAILED;
+ } else if (jetty.isStarted()) {
+ return Status.STARTED;
+ } else if (jetty.isRunning()) {
+ return Status.RUNNING;
+ } else if (jetty.isStopped()) {
+ return Status.STOPPED;
+ } else {
+ return Status.UNKNOWN;
+ }
+ }
+
public void stop() throws Exception {
this.jetty.stop();
this.connector.close();
}
-}
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStoreTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStoreTest.java b/myriad-scheduler/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStoreTest.java
new file mode 100644
index 0000000..a0a9ed1
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MyriadFileSystemRMStateStoreTest.java
@@ -0,0 +1,69 @@
+package org.apache.hadoop.yarn.server.resourcemanager.recovery;
+
+import static org.junit.Assert.assertTrue;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.service.Service.STATE;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState;
+import org.apache.myriad.state.MockDispatcher;
+import org.apache.myriad.state.MockRMApp;
+import org.junit.Test;
+
+/**
+ * Unit tests for MyriadFileSystemRMStateStore
+ */
+public class MyriadFileSystemRMStateStoreTest {
+
+ @Test
+ public void testInit() throws Exception {
+ Configuration conf = getConfiguration();
+ MyriadFileSystemRMStateStore store = new MyriadFileSystemRMStateStore();
+ assertTrue(store.isInState(STATE.NOTINITED));
+ store.init(conf);
+ assertTrue(store.isInState(STATE.INITED));
+ store.startInternal();
+ store.close();
+ }
+
+ @Test
+ public void testStartStop() throws Exception {
+ MyriadFileSystemRMStateStore store = getInitializedStore();
+ store.start();
+ assertTrue(store.isInState(STATE.STARTED));
+ store.stop();
+ assertTrue(store.isInState(STATE.STOPPED));
+ store.close();
+ }
+
+ @Test
+ public void testStoreAndRemoveApplication() throws Exception {
+ MyriadFileSystemRMStateStore store = getInitializedStore();
+ store.start();
+ RMApp appOne = new MockRMApp(0, 0, RMAppState.NEW);
+ RMApp appTwo = new MockRMApp(0, 0, RMAppState.NEW);
+
+ store.storeNewApplication(appOne);
+ store.storeNewApplication(appTwo);
+ store.removeApplication(appOne);
+ store.removeApplication(appTwo);
+ store.close();
+ }
+
+ private MyriadFileSystemRMStateStore getInitializedStore() throws Exception {
+ Configuration conf = getConfiguration();
+ MyriadFileSystemRMStateStore store = new MyriadFileSystemRMStateStore();
+ store.init(conf);
+ store.startInternal();
+ store.loadState();
+ store.loadMyriadState();
+ store.setRMDispatcher(new MockDispatcher());
+ return store;
+ }
+
+ private Configuration getConfiguration() {
+ Configuration conf = new Configuration();
+ conf.set("yarn.resourcemanager.fs.state-store.uri", "file:///tmp/");
+ return conf;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/BaseConfigurableTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/BaseConfigurableTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/BaseConfigurableTest.java
new file mode 100644
index 0000000..45443fe
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/BaseConfigurableTest.java
@@ -0,0 +1,35 @@
+package org.apache.myriad;
+
+import org.apache.myriad.configuration.MyriadConfiguration;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+
+/**
+ * Base class for all JUnit tests that require a MyriadConfiguration object. This class encapsulates the
+ * logic instantiate and configure a MyriadConfiguration object using all yml config files.
+ *
+ */
+public class BaseConfigurableTest {
+ protected MyriadConfiguration cfg;
+ protected MyriadConfiguration cfgWithRole;
+ protected MyriadConfiguration cfgWithDocker;
+
+ @Before
+ public void setUp() throws Exception {
+ ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
+ cfg = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource("myriad-config-test-default.yml"),
+ MyriadConfiguration.class);
+ cfgWithRole = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource("myriad-config-test-default-with-framework-role.yml"),
+ MyriadConfiguration.class);
+ cfgWithDocker = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource("myriad-config-test-default-with-docker-info.yml"),
+ MyriadConfiguration.class);
+ }
+
+ @Test
+ public void testMyriadConfiguration() throws Exception {
+ cfg.getFrameworkName();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/MultiBindingsTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/MultiBindingsTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/MultiBindingsTest.java
index b36f32e..e8cb8b0 100644
--- a/myriad-scheduler/src/test/java/org/apache/myriad/MultiBindingsTest.java
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/MultiBindingsTest.java
@@ -18,15 +18,20 @@
package org.apache.myriad;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
import java.util.Map;
+
import org.apache.myriad.scheduler.TaskFactory;
-import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+
+import com.google.common.collect.Lists;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
/**
* Test for Multibindings
@@ -34,22 +39,17 @@ import static org.junit.Assert.assertNotNull;
public class MultiBindingsTest {
private static Injector injector;
+
+ private List<String> keyNames = Lists.newArrayList("nm", "jobhistory", "timelineserver");
@BeforeClass
public static void setUpBeforeClass() throws Exception {
MyriadTestModule myriadModule = new MyriadTestModule();
injector = Guice.createInjector(myriadModule);
-
- }
-
- @AfterClass
- public static void tearDownAfterClass() throws Exception {
}
@Test
public void multiBindingsTest() {
-
-
MultiBindingsUsage myinstance = injector.getInstance(MultiBindingsUsage.class);
Map<String, TaskFactory> taskMap = myinstance.getMap();
@@ -58,12 +58,7 @@ public class MultiBindingsTest {
taskMap = myinstance.getMap();
for (Map.Entry<String, TaskFactory> entry : taskMap.entrySet()) {
- String keyName = entry.getKey();
- TaskFactory taskFactory = entry.getValue();
- System.out.println(taskFactory);
+ assertTrue(keyNames.contains(entry.getKey()));
}
-
-
}
-
-}
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/TestObjectFactory.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/TestObjectFactory.java b/myriad-scheduler/src/test/java/org/apache/myriad/TestObjectFactory.java
new file mode 100644
index 0000000..c0cf187
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/TestObjectFactory.java
@@ -0,0 +1,90 @@
+package org.apache.myriad;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.yarn.server.resourcemanager.recovery.MyriadFileSystemRMStateStore;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.AbstractYarnScheduler;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerApp;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerNode;
+import org.apache.mesos.Protos;
+import org.apache.mesos.Protos.FrameworkID;
+import org.apache.mesos.Protos.Offer;
+import org.apache.mesos.Protos.OfferID;
+import org.apache.mesos.Protos.SlaveID;
+import org.apache.myriad.configuration.MyriadConfiguration;
+import org.apache.myriad.scheduler.MockSchedulerDriver;
+import org.apache.myriad.scheduler.MyriadDriver;
+import org.apache.myriad.scheduler.MyriadDriverManager;
+import org.apache.myriad.scheduler.yarn.MyriadCapacityScheduler;
+import org.apache.myriad.scheduler.yarn.interceptor.CompositeInterceptor;
+import org.apache.myriad.scheduler.yarn.interceptor.InterceptorRegistry;
+import org.apache.myriad.state.MockDispatcher;
+import org.apache.myriad.state.SchedulerState;
+import org.apache.myriad.webapp.HttpConnectorProvider;
+import org.apache.myriad.webapp.MyriadWebServer;
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.servlet.DefaultServlet;
+import org.mortbay.jetty.servlet.ServletHandler;
+import org.mortbay.jetty.servlet.ServletHolder;
+
+import com.google.inject.servlet.GuiceFilter;
+
+/**
+ * Factory for common objects utilized over 1..n Junit tests
+ */
+public class TestObjectFactory {
+ public static SchedulerState getSchedulerState(MyriadConfiguration cfg) {
+ SchedulerState state = new SchedulerState(new MyriadFileSystemRMStateStore());
+ state.setFrameworkId(FrameworkID.newBuilder().setValue("mock-framework").build());
+ return state;
+ }
+
+ public static MyriadDriverManager getMyriadDriverManager() {
+ return new MyriadDriverManager(new MyriadDriver(new MockSchedulerDriver()));
+ }
+
+ public static InterceptorRegistry getInterceptorRegistry() {
+ return new CompositeInterceptor();
+ }
+
+ public static AbstractYarnScheduler<FiCaSchedulerApp, FiCaSchedulerNode> getYarnScheduler() {
+ MyriadCapacityScheduler scheduler = new MyriadCapacityScheduler();
+ return scheduler;
+ }
+
+ public static Server getJettyServer() {
+ Server server = new Server();
+ ServletHandler context = new ServletHandler();
+ ServletHolder holder = new ServletHolder(DefaultServlet.class);
+ holder.setInitParameter("resourceBase", System.getProperty("user.dir"));
+ holder.setInitParameter("dirAllowed", "true");
+ context.setServer(server);
+ context.addServlet(holder);
+ server.setHandler(context);
+
+ return server;
+ }
+
+ public static MyriadWebServer getMyriadWebServer(MyriadConfiguration cfg) {
+ Server server = TestObjectFactory.getJettyServer();
+ HttpConnectorProvider provider = new HttpConnectorProvider(cfg);
+ Connector connector = provider.get();
+ return new MyriadWebServer(server, connector, new GuiceFilter());
+ }
+
+ public static MyriadFileSystemRMStateStore getStateStore(Configuration conf) throws Exception {
+ conf.set("yarn.resourcemanager.fs.state-store.uri", "file:///tmp/");
+ MyriadFileSystemRMStateStore store = new MyriadFileSystemRMStateStore();
+ store.init(conf);
+ store.start();
+ store.loadState();
+ store.setRMDispatcher(new MockDispatcher());
+ return store;
+ }
+
+ public static Offer getOffer(String host, String slaveId, String frameworkId, String offerId) {
+ Protos.SlaveID sid = SlaveID.newBuilder().setValue(slaveId).build();
+ Protos.FrameworkID fid = FrameworkID.newBuilder().setValue(frameworkId).build();
+ return Protos.Offer.newBuilder().setHostname(host).setId(OfferID.newBuilder().setValue(offerId)).setSlaveId(sid).setFrameworkId(fid).build();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/api/ArtifactsResourceTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/api/ArtifactsResourceTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/api/ArtifactsResourceTest.java
new file mode 100644
index 0000000..5d7bb75
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/api/ArtifactsResourceTest.java
@@ -0,0 +1,51 @@
+package org.apache.myriad.api;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import javax.ws.rs.core.Response;
+
+import org.apache.myriad.BaseConfigurableTest;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit tests for ArtifactsResource
+ */
+public class ArtifactsResourceTest extends BaseConfigurableTest {
+ ArtifactsResource resource;
+ File configFile;
+ File binaryFile;
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ configFile = new File("/tmp/myriadEtc");
+ binaryFile = new File("/tmp/myriadBinary");
+ assertTrue(configFile.createNewFile());
+ assertTrue(binaryFile.createNewFile());
+ resource = new ArtifactsResource(cfg);
+ }
+
+ @Test
+ public void testGetConfig() throws Exception {
+ Response res = resource.getConfig();
+ assertEquals(configFile, res.getEntity());
+ assertEquals(200, res.getStatus());
+ }
+
+ @Test
+ public void testGetBinary() throws Exception {
+ Response res = resource.getBinary();
+ assertEquals(binaryFile, res.getEntity());
+ assertEquals(200, res.getStatus());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ assertTrue(new File("/tmp/myriadEtc").delete());
+ assertTrue(new File("/tmp/myriadBinary").delete());
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/api/SchedulerStateResourceTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/api/SchedulerStateResourceTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/api/SchedulerStateResourceTest.java
new file mode 100644
index 0000000..e57b128
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/api/SchedulerStateResourceTest.java
@@ -0,0 +1,58 @@
+package org.apache.myriad.api;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
+
+import org.apache.hadoop.yarn.server.resourcemanager.recovery.MyriadFileSystemRMStateStore;
+import org.apache.mesos.Protos;
+import org.apache.mesos.Protos.FrameworkID;
+import org.apache.mesos.Protos.TaskID;
+import org.apache.myriad.BaseConfigurableTest;
+import org.apache.myriad.api.model.GetSchedulerStateResponse;
+import org.apache.myriad.scheduler.ServiceResourceProfile;
+import org.apache.myriad.scheduler.constraints.LikeConstraint;
+import org.apache.myriad.state.NodeTask;
+import org.apache.myriad.state.SchedulerState;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit tests for SchedulerStateResource
+ */
+public class SchedulerStateResourceTest extends BaseConfigurableTest {
+ SchedulerStateResource resource;
+ TaskID idOne, idTwo, idThree;
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ resource = new SchedulerStateResource(cfg, getSchedulerState());
+ }
+
+ private SchedulerState getSchedulerState() throws Exception {
+ SchedulerState state = new SchedulerState(new MyriadFileSystemRMStateStore());
+ idOne = Protos.TaskID.newBuilder().setValue("nt-1").build();
+ idTwo = Protos.TaskID.newBuilder().setValue("nt-2").build();
+ idThree = Protos.TaskID.newBuilder().setValue("nt-3").build();
+
+ state.addTask(idOne, new NodeTask(new ServiceResourceProfile("profile1", 0.2, 1024.0), new LikeConstraint("localhost", "host-[0-9]*.example.com")));
+ state.addTask(idTwo, new NodeTask(new ServiceResourceProfile("profile2", 0.4, 2048.0), new LikeConstraint("localhost", "host-[0-9]*.example.com")));
+ state.addTask(idThree, new NodeTask(new ServiceResourceProfile("profile3", 0.6, 3072.0), new LikeConstraint("localhost", "host-[0-9]*.example.com")));
+
+ state.setFrameworkId(FrameworkID.newBuilder().setValue("mock-framework").build());
+ state.makeTaskActive(idOne);
+ state.makeTaskPending(idTwo);
+ state.makeTaskStaging(idThree);
+
+ return state;
+ }
+
+ @Test
+ public void test() throws Exception {
+ GetSchedulerStateResponse response = resource.getState();
+ assertNotNull(response);
+ assertEquals(1, response.getActiveTasks().size());
+ assertEquals(1, response.getPendingTasks().size());
+ assertEquals(1, response.getStagingTasks().size());
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/configuration/MyriadConfigurationTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/configuration/MyriadConfigurationTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/configuration/MyriadConfigurationTest.java
index 22df23d..562d128 100644
--- a/myriad-scheduler/src/test/java/org/apache/myriad/configuration/MyriadConfigurationTest.java
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/configuration/MyriadConfigurationTest.java
@@ -21,71 +21,51 @@ package org.apache.myriad.configuration;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertNotNull;
+import java.util.Iterator;
import java.util.Map;
+import java.util.Set;
-import org.junit.BeforeClass;
+import org.apache.myriad.BaseConfigurableTest;
import org.junit.Test;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import com.google.common.collect.Sets;
/**
- * AuxServices/tasks test
+ * Unit tests for MyriadConfiguration
*/
-public class MyriadConfigurationTest {
+public class MyriadConfigurationTest extends BaseConfigurableTest {
- static MyriadConfiguration cfg;
+ public void testMyriadContainerConfiguration() throws Exception {
+ MyriadContainerConfiguration conf = cfgWithDocker.getContainerInfo().get();
+ assertTrue(conf.getDockerInfo().isPresent());
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
- cfg = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource("myriad-config-test-default.yml"),
- MyriadConfiguration.class);
+ MyriadDockerConfiguration dConf = conf.getDockerInfo().get();
+ assertEquals(false, dConf.getForcePullImage());
+ assertEquals("mesos/myriad", dConf.getImage());
- }
-
- @Test
- public void serviceConfigurationTest() throws Exception {
- Map<String, ServiceConfiguration> auxConfigs = cfg.getServiceConfigurations();
-
- assertEquals(auxConfigs.size(), 2);
-
- for (Map.Entry<String, ServiceConfiguration> entry : auxConfigs.entrySet()) {
- String taskName = entry.getKey();
- ServiceConfiguration config = entry.getValue();
- String outTaskname = config.getTaskName();
- assertEquals(taskName, outTaskname);
+ assertNotNull(conf.getVolumes());
+
+ Set<String> keys = Sets.newHashSet("hostPath", "containerPath", "mode");
+ Set<String> modes = Sets.newHashSet("RO", "RW");
+ Iterator<Map<String, String>> iter = conf.getVolumes().iterator();
+
+ while (iter.hasNext()) {
+ Map<String, String> mcConf = iter.next();
+ assertEquals(keys, mcConf.keySet());
+ assertTrue(modes.contains(mcConf.get("mode")));
}
}
-
+
@Test
- public void coreConfigurationTest() throws Exception {
- assertEquals("MyriadTest", cfg.getFrameworkName());
-
- //authorization parameters
+ public void testRoles() throws Exception {
+ assertEquals("test", cfgWithRole.getFrameworkRole());
assertEquals("*", cfg.getFrameworkRole());
- assertEquals("hduser", cfg.getFrameworkUser().get());
- assertEquals("root", cfg.getFrameworkSuperUser().get());
-
- //ports and directory paths
- assertEquals("10.0.2.15:5050", cfg.getMesosMaster());
- assertEquals("/usr/local/lib/libmesos.so", cfg.getNativeLibrary());
- assertEquals(new Integer(8192), cfg.getRestApiPort());
- assertEquals("10.0.2.15:2181", cfg.getZkServers());
-
- //timeouts
- assertEquals(new Double(44200000), cfg.getFrameworkFailoverTimeout());
- assertEquals(new Integer(25000), cfg.getZkTimeout());
-
- //checkpoints
- assertEquals(false, cfg.isCheckpoint());
- assertEquals(true, cfg.isHAEnabled());
- assertEquals(false, cfg.isRebalancerEnabled());
}
-
+
@Test
- public void executorConfigurationTest() throws Exception {
+ public void testExecutorConfiguration() throws Exception {
MyriadExecutorConfiguration conf = cfg.getMyriadExecutorConfiguration();
assertEquals(new Double(256), conf.getJvmMaxMemoryMB());
@@ -94,7 +74,18 @@ public class MyriadConfigurationTest {
}
@Test
- public void nodeManagerConfigurationTest() throws Exception {
+ public void testServiceConfigurations() throws Exception {
+ Map<String, ServiceConfiguration> confs = cfg.getServiceConfigurations();
+ Set<String> configKeys = Sets.newHashSet("jobhistory", "timelineserver");
+
+ assertEquals(configKeys, confs.keySet());
+ ServiceConfiguration sConfig = confs.get("jobhistory");
+ assertEquals(new Double(1.0), sConfig.getCpus());
+ assertEquals("jobhistory", sConfig.getTaskName());
+ }
+
+ @Test
+ public void testNodeManagerConfiguration() throws Exception {
NodeManagerConfiguration config = cfg.getNodeManagerConfiguration();
assertFalse(config.getCgroups());
@@ -103,7 +94,7 @@ public class MyriadConfigurationTest {
}
@Test
- public void profilesConfigurationTest() throws Exception {
+ public void testProfilesConfiguration() throws Exception {
Map<String, Map<String, String>> profiles = cfg.getProfiles();
for (Map.Entry<String, Map<String, String>> profile : profiles.entrySet()) {
@@ -112,9 +103,9 @@ public class MyriadConfigurationTest {
}
private boolean validateProfile(Map.Entry<String, Map<String, String>> entry) {
- String key = entry.getKey();
+ String key = entry.getKey();
Map<String, String> value = entry.getValue();
-
+
switch (key) {
case "small" : {
return value.get("cpu").equals("1") && value.get("mem").equals("1100");
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/health/HealthCheckUtilsTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/health/HealthCheckUtilsTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/health/HealthCheckUtilsTest.java
new file mode 100644
index 0000000..e403f90
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/health/HealthCheckUtilsTest.java
@@ -0,0 +1,27 @@
+package org.apache.myriad.health;
+
+import java.net.ServerSocket;
+
+import org.junit.Test;
+
+/**
+ * Unit tests for HealthCheckUtils class
+ */
+public class HealthCheckUtilsTest {
+ @Test(expected = IllegalArgumentException.class)
+ public void testInvalidHost() throws Exception {
+ HealthCheckUtils.checkHostPort("localhost-8000");
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testInvalidPort() throws Exception {
+ HealthCheckUtils.checkHostPort("localhost:ab12");
+ }
+
+ @Test
+ public void testValidHostPortString() throws Exception {
+ ServerSocket socket = new ServerSocket(8000);
+ HealthCheckUtils.checkHostPort("localhost:8000");
+ socket.close();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/health/MesosDriverHealthCheckTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/health/MesosDriverHealthCheckTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/health/MesosDriverHealthCheckTest.java
new file mode 100644
index 0000000..cebf2c7
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/health/MesosDriverHealthCheckTest.java
@@ -0,0 +1,69 @@
+package org.apache.myriad.health;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.myriad.scheduler.MockSchedulerDriver;
+import org.apache.myriad.scheduler.MyriadDriver;
+import org.apache.myriad.scheduler.MyriadDriverManager;
+import org.junit.Test;
+
+import com.codahale.metrics.health.HealthCheck.Result;
+
+/**
+ * Unit tests for MesosDriverHealthCheck
+ */
+public class MesosDriverHealthCheckTest {
+
+ private static class HealthCheckTestTuple {
+ MyriadDriverManager manager;
+ MesosDriverHealthCheck checker;
+
+ private HealthCheckTestTuple(MyriadDriverManager manager) {
+ this.manager = manager;
+ this.checker = new MesosDriverHealthCheck(manager);
+ }
+
+ public MyriadDriverManager getManager() {
+ return manager;
+ }
+
+ public MesosDriverHealthCheck getChecker() {
+ return checker;
+ }
+ }
+
+ private HealthCheckTestTuple getTestStack() {
+ MyriadDriver driver = new MyriadDriver(new MockSchedulerDriver());
+ return new HealthCheckTestTuple(new MyriadDriverManager(driver));
+ }
+
+ @Test
+ public void testCheckHealthyResult() throws Exception {
+ HealthCheckTestTuple tuple = getTestStack();
+ MyriadDriverManager manager = tuple.getManager();
+ MesosDriverHealthCheck checker = tuple.getChecker();
+ manager.startDriver();
+ assertEquals(Result.healthy(), checker.check());
+ manager.stopDriver(false);
+ }
+
+ @Test
+ public void testCheckStoppedDriverUnhealthyResult() throws Exception {
+ HealthCheckTestTuple tuple = getTestStack();
+ MyriadDriverManager manager = tuple.getManager();
+ MesosDriverHealthCheck checker = tuple.getChecker();
+ manager.startDriver();
+ manager.stopDriver(false);
+ assertEquals(Result.unhealthy("Driver status: DRIVER_STOPPED"), checker.check());
+ }
+
+ @Test
+ public void testCheckAbortedDriverUnhealthyResult() throws Exception {
+ HealthCheckTestTuple tuple = getTestStack();
+ MyriadDriverManager manager = tuple.getManager();
+ MesosDriverHealthCheck checker = tuple.getChecker();
+ manager.startDriver();
+ manager.abortDriver();
+ assertEquals(Result.unhealthy("Driver status: DRIVER_ABORTED"), checker.check());
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MockSchedulerDriver.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MockSchedulerDriver.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MockSchedulerDriver.java
new file mode 100644
index 0000000..2a60e58
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MockSchedulerDriver.java
@@ -0,0 +1,124 @@
+package org.apache.myriad.scheduler;
+
+import java.util.Collection;
+
+import org.apache.mesos.Protos;
+import org.apache.mesos.Protos.ExecutorID;
+import org.apache.mesos.Protos.Filters;
+import org.apache.mesos.Protos.Offer.Operation;
+import org.apache.mesos.Protos.OfferID;
+import org.apache.mesos.Protos.Request;
+import org.apache.mesos.Protos.SlaveID;
+import org.apache.mesos.Protos.Status;
+import org.apache.mesos.Protos.TaskID;
+import org.apache.mesos.Protos.TaskInfo;
+import org.apache.mesos.Protos.TaskStatus;
+import org.apache.mesos.SchedulerDriver;
+
+/**
+ * Mock SchedulerDriver implementation for JUnit tests
+ */
+public class MockSchedulerDriver implements SchedulerDriver {
+
+ @Override
+ public Status start() {
+ return Protos.Status.DRIVER_RUNNING;
+ }
+
+ @Override
+ public Status stop(boolean failover) {
+ return Protos.Status.DRIVER_STOPPED;
+ }
+
+ @Override
+ public Status stop() {
+ return Protos.Status.DRIVER_STOPPED;
+ }
+
+ @Override
+ public Status abort() {
+ return Protos.Status.DRIVER_ABORTED;
+ }
+
+ @Override
+ public Status join() {
+ return Protos.Status.DRIVER_RUNNING;
+ }
+
+ @Override
+ public Status run() {
+ return Protos.Status.DRIVER_RUNNING;
+ }
+
+ @Override
+ public Status requestResources(Collection<Request> requests) {
+ return null;
+ }
+
+ @Override
+ public Status launchTasks(Collection<OfferID> offerIds, Collection<TaskInfo> tasks, Filters filters) {
+ return null;
+ }
+
+ @Override
+ public Status launchTasks(Collection<OfferID> offerIds, Collection<TaskInfo> tasks) {
+ return null;
+ }
+
+ @Override
+ @SuppressWarnings("deprecation")
+ public Status launchTasks(OfferID offerId, Collection<TaskInfo> tasks, Filters filters) {
+ return null;
+ }
+
+ @Override
+ @SuppressWarnings("deprecation")
+ public Status launchTasks(OfferID offerId, Collection<TaskInfo> tasks) {
+ return null;
+ }
+
+ @Override
+ public Status killTask(TaskID taskId) {
+ return null;
+ }
+
+ @Override
+ public Status acceptOffers(Collection<OfferID> offerIds, Collection<Operation> operations, Filters filters) {
+ return null;
+ }
+
+ @Override
+ public Status declineOffer(OfferID offerId, Filters filters) {
+ return null;
+ }
+
+ @Override
+ public Status declineOffer(OfferID offerId) {
+ return null;
+ }
+
+ @Override
+ public Status reviveOffers() {
+ return null;
+ }
+
+ @Override
+ public Status suppressOffers() {
+ return null;
+ }
+
+ @Override
+ public Status acknowledgeStatusUpdate(TaskStatus status) {
+ return null;
+ }
+
+ @Override
+ public Status sendFrameworkMessage(ExecutorID executorId, SlaveID slaveId, byte[] data) {
+ return null;
+ }
+
+ @Override
+ public Status reconcileTasks(Collection<TaskStatus> statuses) {
+ return null;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MyriadDriverTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MyriadDriverTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MyriadDriverTest.java
new file mode 100644
index 0000000..d384150
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MyriadDriverTest.java
@@ -0,0 +1,43 @@
+package org.apache.myriad.scheduler;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.mesos.Protos;
+import org.apache.mesos.Protos.Status;
+import org.apache.mesos.SchedulerDriver;
+import org.junit.Test;
+
+/**
+ * Unit test for MyriadDriver class
+ */
+public class MyriadDriverTest {
+ @Test
+ public void testStart() throws Exception {
+ MyriadDriver driver = new MyriadDriver(new MockSchedulerDriver());
+ Status status = driver.start();
+ assertEquals(Protos.Status.DRIVER_RUNNING_VALUE, status.getNumber());
+ }
+
+ @Test
+ public void testAbort() throws Exception {
+ MyriadDriver driver = new MyriadDriver(new MockSchedulerDriver());
+ Status status = driver.abort();
+ assertEquals(Protos.Status.DRIVER_ABORTED_VALUE, status.getNumber());
+ }
+
+ @Test
+ public void testStop() throws Exception {
+ MyriadDriver driver = new MyriadDriver(new MockSchedulerDriver());
+ Status status = driver.stop(true);
+ assertEquals(Protos.Status.DRIVER_STOPPED_VALUE, status.getNumber());
+ }
+
+ @Test
+ public void testGetDriver() throws Exception {
+ MyriadDriver driver = new MyriadDriver(new MockSchedulerDriver());
+ SchedulerDriver sDriver = driver.getDriver();
+
+ assertTrue(sDriver instanceof MockSchedulerDriver);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MyriadOperationsTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MyriadOperationsTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MyriadOperationsTest.java
new file mode 100644
index 0000000..6c039dd
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/MyriadOperationsTest.java
@@ -0,0 +1,112 @@
+package org.apache.myriad.scheduler;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.yarn.event.Dispatcher;
+import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.ahs.RMApplicationHistoryWriter;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.AMLivelinessMonitor;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.AbstractYarnScheduler;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerApp;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerNode;
+import org.apache.hadoop.yarn.server.resourcemanager.security.RMDelegationTokenSecretManager;
+import org.apache.mesos.Protos.FrameworkID;
+import org.apache.myriad.BaseConfigurableTest;
+import org.apache.myriad.TestObjectFactory;
+import org.apache.myriad.configuration.MyriadBadConfigurationException;
+import org.apache.myriad.policy.LeastAMNodesFirstPolicy;
+import org.apache.myriad.scheduler.constraints.Constraint;
+import org.apache.myriad.scheduler.constraints.LikeConstraint;
+import org.apache.myriad.scheduler.yarn.interceptor.CompositeInterceptor;
+import org.apache.myriad.state.MockDispatcher;
+import org.apache.myriad.state.MockRMContext;
+import org.apache.myriad.state.SchedulerState;
+import org.apache.myriad.webapp.MyriadWebServer;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit tests for MyriadOperations class
+ */
+public class MyriadOperationsTest extends BaseConfigurableTest {
+ MyriadOperations ops;
+ ServiceResourceProfile small;
+ Constraint constraint = new LikeConstraint("localhost", "host-[0-9]*.example.com");
+ SchedulerState sState;
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ AbstractYarnScheduler<FiCaSchedulerApp, FiCaSchedulerNode> scheduler = TestObjectFactory.getYarnScheduler();
+ //sState = new SchedulerState(new MyriadFileSystemRMStateStore());
+ sState = TestObjectFactory.getSchedulerState(cfg);
+ sState.setFrameworkId(FrameworkID.newBuilder().setValue("mock-framework").build());
+
+ MyriadDriverManager manager = TestObjectFactory.getMyriadDriverManager();
+ MyriadWebServer webServer = TestObjectFactory.getMyriadWebServer(cfg);
+ CompositeInterceptor registry = new CompositeInterceptor();
+ LeastAMNodesFirstPolicy policy = new LeastAMNodesFirstPolicy(registry, scheduler, sState);
+
+ manager.startDriver();
+
+ ops = new MyriadOperations(cfg, sState, policy, manager, webServer, generateRMContext(scheduler));
+ generateProfiles();
+ }
+
+ private void generateProfiles() {
+ small = new ServiceResourceProfile("small", 0.1, 512.0);
+ }
+
+ private RMContext generateRMContext(AbstractYarnScheduler<FiCaSchedulerApp, FiCaSchedulerNode> scheduler) throws Exception {
+ Configuration conf = new Configuration();
+ MockRMContext context = null;
+ Dispatcher dispatcher = new MockDispatcher();
+
+ RMApplicationHistoryWriter rmApplicationHistoryWriter = new RMApplicationHistoryWriter();
+ AMLivelinessMonitor amLivelinessMonitor = new AMLivelinessMonitor(dispatcher);
+ AMLivelinessMonitor amFinishingMonitor = new AMLivelinessMonitor(dispatcher);
+ RMDelegationTokenSecretManager delegationTokenSecretManager = new RMDelegationTokenSecretManager(1, 1, 1, 1, context);
+
+ context = new MockRMContext();
+ context.setStateStore(TestObjectFactory.getStateStore(conf));
+ context.setAmLivelinessMonitor(amLivelinessMonitor);
+ context.setAmFinishingMonitor(amFinishingMonitor);
+ context.setRMApplicationHistoryWriter(rmApplicationHistoryWriter);
+ context.setRMDelegationTokenSecretManager(delegationTokenSecretManager);
+ return context;
+ }
+
+ @Test
+ public void testFlexUpAndFlexDownCluster() throws Exception {
+ assertEquals(0, sState.getPendingTaskIds().size());
+ ops.flexUpCluster(small, 1, constraint);
+ assertEquals(1, sState.getPendingTaskIds().size());
+ ops.flexDownCluster(small, constraint, 1);
+ assertEquals(0, sState.getPendingTaskIds().size());
+ }
+
+ @Test
+ public void testFlexUpAndFlexDownService() throws Exception {
+ ops.flexUpAService(1, "jobhistory");
+ assertEquals(1, sState.getPendingTasksByType("jobhistory").size());
+ ops.flexDownAService(1, "jobhistory");
+ assertEquals(0, sState.getPendingTasksByType("jobhistory").size());
+ }
+
+ @Test(expected = MyriadBadConfigurationException.class)
+ public void testFlexUpAServiceOverMaxInstances() throws Exception {
+ ops.flexUpAService(2, "jobhistory");
+ }
+
+ @Test
+ public void testGetFlexibleInstances() throws Exception {
+ ops.flexUpAService(1, "jobhistory");
+ assertEquals(1, ops.getFlexibleInstances("jobhistory").intValue());
+ }
+
+ @Test
+ public void testShutdownCluster() throws Exception {
+ ops.shutdownFramework();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/NMProfileManagerTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/NMProfileManagerTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/NMProfileManagerTest.java
new file mode 100644
index 0000000..a0aab74
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/NMProfileManagerTest.java
@@ -0,0 +1,63 @@
+package org.apache.myriad.scheduler;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+/**
+ * Unit test cases for NMProfileManager
+ */
+public class NMProfileManagerTest {
+ private NMProfileManager getNMProfileManager() {
+ NMProfileManager manager = new NMProfileManager();
+ NMProfile profile1 = new NMProfile("profile1", 1L, 512L);
+ NMProfile profile2 = new NMProfile("profile2", 2L, 1024L);
+ NMProfile profile3 = new NMProfile("profile3", 3L, 2048L);
+ NMProfile profile4 = new NMProfile("profile4", 4L, 3072L);
+ NMProfile profile5 = new NMProfile("profile5", 5L, 4096L);
+
+ manager.add(profile1);
+ manager.add(profile2);
+ manager.add(profile3);
+ manager.add(profile4);
+ manager.add(profile5);
+
+ return manager;
+ }
+
+ @Test
+ public void testAdd() throws Exception {
+ NMProfileManager manager = this.getNMProfileManager();
+ assertEquals(5, manager.numberOfProfiles());
+ }
+
+ @Test
+ public void testRetrieval() throws Exception {
+ NMProfileManager manager = this.getNMProfileManager();
+ assertEquals("profile1", manager.get("profile1").getName());
+ assertEquals("profile2", manager.get("profile2").getName());
+ assertEquals("profile3", manager.get("profile3").getName());
+ assertEquals("profile4", manager.get("profile4").getName());
+ assertEquals("profile5", manager.get("profile5").getName());
+ }
+
+ @Test
+ public void testExists() throws Exception {
+ NMProfileManager manager = this.getNMProfileManager();
+ assertTrue(manager.exists("profile1"));
+ assertTrue(manager.exists("profile2"));
+ assertTrue(manager.exists("profile3"));
+ assertTrue(manager.exists("profile4"));
+ assertTrue(manager.exists("profile5"));
+ }
+ @Test
+ public void testToString() throws Exception {
+ NMProfileManager manager = this.getNMProfileManager();
+ String toString = manager.toString();
+ assertTrue(toString.contains("\"name\":\"profile1\",\"cpus\":1,\"memory\":512"));
+ assertTrue(toString.contains("\"name\":\"profile2\",\"cpus\":2,\"memory\":1024"));
+ assertTrue(toString.contains("\"name\":\"profile3\",\"cpus\":3,\"memory\":2048"));
+ assertTrue(toString.contains("\"name\":\"profile4\",\"cpus\":4,\"memory\":3072"));
+ assertTrue(toString.contains("\"name\":\"profile5\",\"cpus\":5,\"memory\":4096"));
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/ServiceResourceProfileTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/ServiceResourceProfileTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/ServiceResourceProfileTest.java
new file mode 100644
index 0000000..72e0092
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/ServiceResourceProfileTest.java
@@ -0,0 +1,31 @@
+package org.apache.myriad.scheduler;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit test cases for ServiceResourceProfile
+ *
+ */
+public class ServiceResourceProfileTest {
+ ServiceResourceProfile profile;
+
+ @Before
+ public void setUp() throws Exception {
+ profile = new ServiceResourceProfile("ServiceResourceProfile", 0.1, 1024.0, 0.1, 512.0);
+ }
+
+ @Test
+ public void testRequestedResources() throws Exception {
+ Assert.assertEquals(new Double(0.1), profile.getCpus());
+ Assert.assertEquals(new Double(1024.0), profile.getMemory());
+ Assert.assertEquals(new Double(0.1), profile.getExecutorCpu());
+ Assert.assertEquals(new Double(512.0), profile.getExecutorMemory());
+ }
+
+ @Test
+ public void testName() throws Exception {
+ Assert.assertEquals("ServiceResourceProfile", profile.getName());
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TaskConstraintsManagerTest.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TaskConstraintsManagerTest.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TaskConstraintsManagerTest.java
new file mode 100644
index 0000000..94946ce
--- /dev/null
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TaskConstraintsManagerTest.java
@@ -0,0 +1,32 @@
+package org.apache.myriad.scheduler;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.myriad.BaseConfigurableTest;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit tests for TaskConstraintsManager
+ */
+public class TaskConstraintsManagerTest extends BaseConfigurableTest {
+ TaskConstraintsManager manager = new TaskConstraintsManager();
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ manager.addTaskConstraints("jobhistory", new ServiceTaskConstraints(cfg, "jobhistory"));
+ }
+
+ @Test
+ public void testAddConstraints() throws Exception {
+ assertTrue(manager.exists("jobhistory"));
+ }
+
+ @Test
+ public void testGetConstraints() throws Exception {
+ TaskConstraints tCon = manager.getConstraints("jobhistory");
+ assertEquals(3, tCon.portsCount());
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestServiceCommandLine.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestServiceCommandLine.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestServiceCommandLine.java
index e49c19c..87aee56 100644
--- a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestServiceCommandLine.java
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestServiceCommandLine.java
@@ -18,24 +18,17 @@
*/
package org.apache.myriad.scheduler;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import static org.junit.Assert.assertTrue;
+
import org.apache.mesos.Protos.CommandInfo;
-import org.apache.myriad.configuration.MyriadConfiguration;
+import org.apache.myriad.BaseConfigurableTest;
import org.apache.myriad.scheduler.TaskFactory.NMTaskFactoryImpl;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
import org.junit.Test;
-import static org.junit.Assert.assertTrue;
-
/**
* Class to test CommandLine generation
*/
-public class TestServiceCommandLine {
-
- static MyriadConfiguration cfg;
-
+public class TestServiceCommandLine extends BaseConfigurableTest {
static String toJHSCompare =
"echo \" sudo tar -zxpf hadoop-2.7.0.tar.gz && sudo cp conf /usr/local/hadoop/etc/hadoop/yarn-site.xml; " +
"export TASK_DIR=`basename $PWD`; sudo chmod +wx /sys/fs/cgroup/cpu/mesos/$TASK_DIR;" +
@@ -44,18 +37,6 @@ public class TestServiceCommandLine {
static String toCompare =
"echo \" sudo tar -zxpf hadoop-2.7.0.tar.gz && sudo cp conf /usr/local/hadoop/etc/hadoop/yarn-site.xml;";
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
- cfg = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource("myriad-config-test-default.yml"),
- MyriadConfiguration.class);
-
- }
-
- @AfterClass
- public static void tearDownAfterClass() throws Exception {
- }
-
@Test
public void testJHSCommandLineGeneration() throws Exception {
ServiceTaskFactoryImpl jhs = new ServiceTaskFactoryImpl(cfg, null);
http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/4a6e50c4/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestTaskUtils.java
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestTaskUtils.java b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestTaskUtils.java
index 06fa698..29d7691 100644
--- a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestTaskUtils.java
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestTaskUtils.java
@@ -17,48 +17,25 @@
*/
package org.apache.myriad.scheduler;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
-import com.google.common.collect.Range;
-import com.google.common.collect.Ranges;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import org.apache.mesos.Protos;
+import org.apache.myriad.BaseConfigurableTest;
import org.apache.myriad.configuration.MyriadBadConfigurationException;
-import org.apache.myriad.configuration.MyriadConfiguration;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
import org.junit.Test;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import com.google.common.collect.Range;
+import com.google.common.collect.Ranges;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
/**
* Tests for TaskUtils
*/
-public class TestTaskUtils {
-
- static MyriadConfiguration cfg;
- static MyriadConfiguration cfgWithRole;
- static MyriadConfiguration cfgWithDocker;
+public class TestTaskUtils extends BaseConfigurableTest {
static double epsilon = .0001;
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
- cfg = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource("myriad-config-test-default.yml"),
- MyriadConfiguration.class);
- cfgWithRole = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource("myriad-config-test-default-with-framework-role.yml"),
- MyriadConfiguration.class);
- cfgWithDocker = mapper.readValue(Thread.currentThread().getContextClassLoader().getResource("myriad-config-test-default-with-docker-info.yml"),
- MyriadConfiguration.class);
-
- }
-
- @AfterClass
- public static void tearDownAfterClass() throws Exception {
- }
-
@Test
public void testGetResource() {
TaskUtils taskUtils = new TaskUtils(cfg);