Repository: incubator-myriad
Updated Branches:
  refs/heads/master df4cbc0e9 -> 7aea259cf


http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/7aea259c/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 87aee56..b6806a2 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,53 +18,106 @@
  */
 package org.apache.myriad.scheduler;
 
+import org.apache.commons.lang.StringUtils;
+import org.apache.mesos.Protos;
 import static org.junit.Assert.assertTrue;
 
 import org.apache.mesos.Protos.CommandInfo;
+import org.apache.myriad.configuration.ServiceConfiguration;
 import org.apache.myriad.BaseConfigurableTest;
-import org.apache.myriad.scheduler.TaskFactory.NMTaskFactoryImpl;
 import org.junit.Test;
 
+import java.util.*;
+
 /**
  * Class to test CommandLine generation
  */
 public class TestServiceCommandLine extends BaseConfigurableTest {
+
+  public static final String KEY_NM_ADDRESS = 
"myriad.yarn.nodemanager.address";
+  public static final String KEY_NM_LOCALIZER_ADDRESS = 
"myriad.yarn.nodemanager.localizer.address";
+  public static final String KEY_NM_WEBAPP_ADDRESS = 
"myriad.yarn.nodemanager.webapp.address";
+  public static final String KEY_NM_SHUFFLE_PORT = 
"myriad.mapreduce.shuffle.port";
+
+  public static final String KEY_JHS_WEBAPP_ADDRESS = 
"myriad.mapreduce.jobhistory.webapp.address";
+  public static final String KEY_JHS_ADMIN_ADDRESS = 
"myriad.mapreduce.jobhistory.admin.address";
+  public static final String KEY_JHS_ADDRESS = 
"myriad.mapreduce.jobhistory.address";
+
+  private static final String msgFormat = System.lineSeparator() + "%s" + 
System.lineSeparator() + "!="
+      + System.lineSeparator() + "%s";
+  protected static final String CMD_FORMAT = "echo \"%1$s\" && %1$s";
   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;" +
-      "sudo -E -u hduser -H  $YARN_HOME/bin/mapred historyserver\"; sudo tar 
-zxpf hadoop-2.5.0.tar.gz &&  sudo  cp" +
-      " conf /usr/local/hadoop/etc/hadoop/yarn-site.xml; sudo -E -u hduser -H 
$YARN_HOME/bin/mapred historyserver";
+      " sudo tar -zxpf hadoop-2.7.0.tar.gz &&  sudo  cp yarnConfiguration 
/usr/local/hadoop/etc/hadoop/yarn-site.xml &&  " +
+          "sudo -E -u hduser -H  bin/mapred historyserver";
   static String toCompare =
-      "echo \" sudo tar -zxpf hadoop-2.7.0.tar.gz &&  sudo  cp conf 
/usr/local/hadoop/etc/hadoop/yarn-site.xml;";
+      " sudo tar -zxpf hadoop-2.7.0.tar.gz &&  sudo  cp yarnConfiguration 
/usr/local/hadoop/etc/hadoop/yarn-site.xml &&  " +
+          "sudo -E -u hduser -H  $YARN_HOME/bin/yarn nodemanager";
 
   @Test
   public void testJHSCommandLineGeneration() throws Exception {
-    ServiceTaskFactoryImpl jhs = new ServiceTaskFactoryImpl(cfg, null);
-    String executorCmd = "$YARN_HOME/bin/mapred historyserver";
-    ServiceResourceProfile profile = new ServiceResourceProfile("jobhistory", 
10.0, 15.0);
+    Map<String, Long> portsMap = new TreeMap<>();
+    portsMap.put(KEY_JHS_ADDRESS, 0L);
+    portsMap.put(KEY_JHS_WEBAPP_ADDRESS, 3L);
+    portsMap.put(KEY_JHS_ADMIN_ADDRESS, 0L);
+
+    ServiceResourceProfile profile = new ServiceResourceProfile("jobhistory", 
10.0, 15.0, portsMap);
+    ServiceConfiguration serviceConfiguration = 
cfg.getServiceConfiguration("jobhistory").get();
+    ServiceCommandLineGenerator serviceCommandLineGenerator = new 
ServiceCommandLineGenerator(cfg);
+    List<Long> ports = new ArrayList<>();
+    ports.add(2L);
+    ports.add(1L);
+    ports.add(3L);
 
-    CommandInfo cInfo = jhs.createCommandInfo(profile, executorCmd);
-    System.out.println(toJHSCompare);
-    System.out.println(cInfo.getValue());
+    CommandInfo cInfo = 
serviceCommandLineGenerator.generateCommandLine(profile,
+        serviceConfiguration,
+        ports);
+    String testVal =  String.format(CMD_FORMAT, toJHSCompare);
+    assertTrue(String.format(msgFormat, cInfo.getValue(), testVal),
+        cInfo.getValue().equals(testVal));
 
-    assertTrue(cInfo.getValue().startsWith(toCompare));
+    List<Protos.Environment.Variable> environmentList = 
cInfo.getEnvironment().getVariablesList();
+    String yarnOpts = "";
+    for (Protos.Environment.Variable variable: environmentList) {
+      if 
(variable.getName().equals(ServiceCommandLineGenerator.ENV_HADOOP_OPTS)){
+        yarnOpts = variable.getValue();
+      }
+    }
+    assertTrue("Environment contains " + 
ServiceCommandLineGenerator.ENV_HADOOP_OPTS, StringUtils.isNotEmpty(yarnOpts));
+    System.out.println(yarnOpts);
+    assertTrue(ServiceCommandLineGenerator.ENV_HADOOP_OPTS + " must contain 
-D" + KEY_JHS_WEBAPP_ADDRESS +
+        "=0.0.0.0:3", yarnOpts.contains(KEY_JHS_WEBAPP_ADDRESS + 
"=0.0.0.0:3"));
   }
 
   @Test
   public void testNMCommandLineGeneration() throws Exception {
     Long[] ports = new Long[]{1L, 2L, 3L, 4L};
-    NMPorts nmPorts = new NMPorts(ports);
+    List<Long> nmPorts = Arrays.asList(ports);
+    Map<String, Long> portsMap = new TreeMap<>();
+    portsMap.put(KEY_NM_ADDRESS, 0L);
+    portsMap.put(KEY_NM_WEBAPP_ADDRESS, 0L);
+    portsMap.put(KEY_NM_LOCALIZER_ADDRESS, 0L);
+    portsMap.put(KEY_NM_SHUFFLE_PORT, 0L);
 
-    ServiceResourceProfile profile = new ExtendedResourceProfile(new 
NMProfile("nm", 10L, 15L), 3.0, 5.0);
+    ServiceResourceProfile profile = new ExtendedResourceProfile(new 
NMProfile("nm", 10L, 15L), 3.0, 5.0, portsMap);
 
-    ExecutorCommandLineGenerator clGenerator = new 
DownloadNMExecutorCLGenImpl(cfg,
-        "hdfs://namenode:port/dist/hadoop-2.7.0.tar.gz");
-    NMTaskFactoryImpl nms = new NMTaskFactoryImpl(cfg, null, clGenerator);
+    ExecutorCommandLineGenerator clGenerator = new 
NMExecutorCommandLineGenerator(cfg);
 
-    CommandInfo cInfo = nms.getCommandInfo(profile, nmPorts);
-    System.out.println(toCompare);
-    System.out.println(cInfo.getValue());
-    assertTrue(cInfo.getValue().startsWith(toCompare));
+    CommandInfo cInfo = clGenerator.generateCommandLine(profile, null, 
nmPorts);
+    String testVal =  String.format(CMD_FORMAT, toCompare);
+    assertTrue(String.format(msgFormat, cInfo.getValue(), testVal),
+        cInfo.getValue().equals(testVal));
 
+    List<Protos.Environment.Variable> environmentList = 
cInfo.getEnvironment().getVariablesList();
+    String yarnOpts = "";
+    for (Protos.Environment.Variable variable: environmentList) {
+      if 
(variable.getName().equals(NMExecutorCommandLineGenerator.ENV_YARN_NODEMANAGER_OPTS)){
+        yarnOpts = variable.getValue();
+      }
+    }
+    System.out.println(yarnOpts);
+    assertTrue("Environment contains " + 
NMExecutorCommandLineGenerator.ENV_YARN_NODEMANAGER_OPTS, 
StringUtils.isNotEmpty(yarnOpts));
+    assertTrue(NMExecutorCommandLineGenerator.ENV_YARN_NODEMANAGER_OPTS + " 
must contain -D" + KEY_NM_SHUFFLE_PORT +
+        "=1", yarnOpts.contains(KEY_NM_SHUFFLE_PORT + "=1"));
   }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/7aea259c/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestServiceTaskFactory.java
----------------------------------------------------------------------
diff --git 
a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestServiceTaskFactory.java
 
b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestServiceTaskFactory.java
new file mode 100644
index 0000000..bdd40e6
--- /dev/null
+++ 
b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/TestServiceTaskFactory.java
@@ -0,0 +1,77 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myriad.scheduler;
+
+import org.apache.mesos.Protos;
+import org.apache.myriad.BaseConfigurableTest;
+import org.apache.myriad.configuration.ServiceConfiguration;
+import org.apache.myriad.scheduler.offer.OfferBuilder;
+import org.apache.myriad.scheduler.resource.ResourceOfferContainer;
+import org.apache.myriad.state.NodeTask;
+import org.junit.Test;
+
+import java.util.Map;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+
+/**
+ * Tests for ServiceTaskFactory Class
+ */
+public class TestServiceTaskFactory extends BaseConfigurableTest {
+  static Protos.FrameworkID frameworkId = 
Protos.FrameworkID.newBuilder().setValue("test").build();
+
+  @Test
+  public void testServiceTaskFactory() {
+    ServiceCommandLineGenerator clGenerator = new 
ServiceCommandLineGenerator(cfgWithDocker);
+    TaskUtils taskUtils = new TaskUtils(cfgWithDocker);
+    Protos.Offer offer = new OfferBuilder("test.com")
+        .addScalarResource("cpus", 10.0)
+        .addScalarResource("mem", 16000)
+        .addRangeResource("ports", 3400, 3410)
+        .build();
+    Map<String, ServiceConfiguration> stringServiceConfigurationMap = 
cfgWithDocker.getServiceConfigurations();
+    System.out.print(stringServiceConfigurationMap);
+    ServiceConfiguration serviceConfiguration = 
cfgWithDocker.getServiceConfigurations().get("jobhistory");
+    ServiceResourceProfile profile = new ServiceResourceProfile("jobhistory", 
serviceConfiguration.getCpus(),
+        serviceConfiguration.getJvmMaxMemoryMB(), 
serviceConfiguration.getPorts());
+    NodeTask nodeTask = new NodeTask(profile, null);
+    nodeTask.setTaskPrefix("jobhistory");
+    ResourceOfferContainer roc = new ResourceOfferContainer(offer, profile, 
null);
+    System.out.print(roc.getPorts());
+    ServiceTaskFactory taskFactory = new ServiceTaskFactory(cfgWithDocker, 
taskUtils, clGenerator);
+    Protos.TaskInfo taskInfo = taskFactory.createTask(roc, frameworkId, 
makeTaskId("jobhistory"), nodeTask);
+    assertTrue("taskInfo should have a container", taskInfo.hasContainer());
+    assertFalse("The container should not have an executor", 
taskInfo.hasExecutor());
+    Protos.ContainerInfo containerInfo = taskInfo.getContainer();
+    assertTrue("There should be two volumes", containerInfo.getVolumesCount() 
== 2);
+    assertTrue("The first volume should be read only", 
containerInfo.getVolumes(0).getMode().equals(Protos.Volume.Mode.RO));
+    assertTrue("The first volume should be read write", 
containerInfo.getVolumes(1).getMode().equals(Protos.Volume.Mode.RW));
+    assertTrue("There should be a docker image", 
containerInfo.getDocker().hasImage());
+    assertTrue("The docker image should be mesos/myraid", 
containerInfo.getDocker().getImage().equals("mesos/myriad"));
+    assertTrue("Should be using host networking", 
containerInfo.getDocker().getNetwork().equals(Protos.ContainerInfo.DockerInfo.Network.HOST));
+    assertTrue("There should be two parameters", 
containerInfo.getDocker().getParametersList().size() == 2);
+    assertTrue("Privledged mode should be false", 
containerInfo.getDocker().getPrivileged() == false);
+  }
+
+  private Protos.TaskID makeTaskId(String taskId) {
+    return Protos.TaskID.newBuilder().setValue(taskId).build();
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/7aea259c/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 d543c29..21b5ad0 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,15 +17,18 @@
  */
 package org.apache.myriad.scheduler;
 
+import static org.junit.Assert.assertTrue;
+import org.apache.mesos.Protos;
+import org.apache.myriad.BaseConfigurableTest;
+import org.junit.Test;
+
 import com.google.common.collect.Range;
 import com.google.common.collect.Ranges;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
-import org.apache.mesos.Protos;
-import org.apache.myriad.BaseConfigurableTest;
-import org.junit.Test;
 
-import static org.junit.Assert.assertTrue;
+import java.util.HashMap;
+
 
 /**
  * Tests for TaskUtils
@@ -40,7 +43,7 @@ public class TestTaskUtils extends BaseConfigurableTest {
     Gson gson = new 
GsonBuilder().registerTypeAdapter(ServiceResourceProfile.class, new 
ServiceResourceProfile.CustomDeserializer())
         .create();
 
-    ServiceResourceProfile parentProfile = new ServiceResourceProfile("abc", 
1.0, 100.0);
+    ServiceResourceProfile parentProfile = new ServiceResourceProfile("abc", 
1.0, 100.0, new HashMap<String, Long>());
 
     String parentStr = gson.toJson(parentProfile);
     ServiceResourceProfile processedProfile = gson.fromJson(parentStr, 
ServiceResourceProfile.class);
@@ -48,7 +51,8 @@ public class TestTaskUtils extends BaseConfigurableTest {
     
assertTrue(processedProfile.getClass().equals(ServiceResourceProfile.class));
     assertTrue(processedProfile.toString().equalsIgnoreCase(parentStr));
 
-    ServiceResourceProfile childProfile = new ExtendedResourceProfile(new 
NMProfile("bcd", 5L, 15L), 2.0, 7.0);
+    ServiceResourceProfile childProfile = new ExtendedResourceProfile(new 
NMProfile("bcd", 5L, 15L), 2.0, 7.0,
+        cfg.getNodeManagerConfiguration().getPorts());
 
     String childStr = gson.toJson(childProfile);
     ServiceResourceProfile processedChildProfile = gson.fromJson(childStr, 
ServiceResourceProfile.class);
@@ -124,25 +128,4 @@ public class TestTaskUtils extends BaseConfigurableTest {
     checkResourceList(taskUtils.getScalarResource(createScalarOffer("cpus", 
0.0, 2.0), "cpus", 0.5, 1.5), "cpus", 0.0, 0.5);
   }
 
-  @Test
-  public void testContainerInfo() {
-    TaskUtils taskUtils = new TaskUtils(cfgWithDocker);
-    Protos.ContainerInfo containerInfo = taskUtils.getContainerInfo();
-    assertTrue("The container should have a docker", 
containerInfo.hasDocker());
-    assertTrue("There should be two volumes", containerInfo.getVolumesCount() 
== 2);
-    assertTrue("The first volume should be read only", 
containerInfo.getVolumes(0).getMode().equals(Protos.Volume.Mode.RO));
-    assertTrue("The first volume should be read write", 
containerInfo.getVolumes(1).getMode().equals(Protos.Volume.Mode.RW));
-  }
-
-  @Test public void testDockerInfo() {
-    TaskUtils taskUtils = new TaskUtils(cfgWithDocker);
-    Protos.ContainerInfo containerInfo = taskUtils.getContainerInfo();
-    assertTrue("The container should have a docker", 
containerInfo.hasDocker());
-    assertTrue("There should be two volumes", 
containerInfo.getVolumesList().size() == 2);
-    assertTrue("There should be a docker image", 
containerInfo.getDocker().hasImage());
-    assertTrue("The docker image should be mesos/myraid", 
containerInfo.getDocker().getImage().equals("mesos/myriad"));
-    assertTrue("Should be using host networking", 
containerInfo.getDocker().getNetwork().equals(Protos.ContainerInfo.DockerInfo.Network.HOST));
-    assertTrue("There should be two parameters", 
containerInfo.getDocker().getParametersList().size() == 2);
-    assertTrue("Privledged mode should be false", 
containerInfo.getDocker().getPrivileged() == false);
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/7aea259c/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/fgs/YarnNodeCapacityManagerTest.java
----------------------------------------------------------------------
diff --git 
a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/fgs/YarnNodeCapacityManagerTest.java
 
b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/fgs/YarnNodeCapacityManagerTest.java
index e1f4eb5..a4f4268 100644
--- 
a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/fgs/YarnNodeCapacityManagerTest.java
+++ 
b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/fgs/YarnNodeCapacityManagerTest.java
@@ -4,6 +4,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import java.util.Set;
+import java.util.TreeMap;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.yarn.api.records.NodeId;
@@ -62,7 +63,8 @@ public class YarnNodeCapacityManagerTest extends 
BaseConfigurableTest {
   
   private Set<NodeTask> getNodeTasks() {
     Constraint cZero = new LikeConstraint("0.0.0.1", 
"host-[0-9]*.example.com");
-    ServiceResourceProfile zProfile = new ServiceResourceProfile("zProfile", 
0.0, 0.0, 0.0, 0.0);
+    TreeMap<String, Long> ports = new TreeMap<>();
+    ServiceResourceProfile zProfile = new ServiceResourceProfile("zProfile", 
0.0, 0.0, ports);
 
     ntZero = new NodeTask(zProfile, cZero);
     ntZero.setTaskPrefix("nm");

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/7aea259c/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/offer/OfferBuilder.java
----------------------------------------------------------------------
diff --git 
a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/offer/OfferBuilder.java
 
b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/offer/OfferBuilder.java
new file mode 100644
index 0000000..6772409
--- /dev/null
+++ 
b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/offer/OfferBuilder.java
@@ -0,0 +1,117 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.myriad.scheduler.offer;
+
+import org.apache.mesos.Protos;
+
+import java.util.Collections;
+
+
+/**
+ * Simple builder to make Offers for tests
+ */
+public class OfferBuilder {
+  Protos.Offer.Builder offer = Protos.Offer.newBuilder();
+
+  public OfferBuilder(String offerId, String hostname, String slaveId) {
+    offer.setHostname(hostname);
+    offer.setId(Protos.OfferID.newBuilder().setValue(offerId));
+    offer.setSlaveId(Protos.SlaveID.newBuilder().setValue(slaveId));
+    offer.setFrameworkId(Protos.FrameworkID.newBuilder().setValue("Myriad"));
+  }
+  public OfferBuilder(String offerId, String hostname) {
+    offer.setHostname(hostname);
+    offer.setId(Protos.OfferID.newBuilder().setValue(offerId));
+    offer.setSlaveId(Protos.SlaveID.newBuilder().setValue("agent"));
+    offer.setFrameworkId(Protos.FrameworkID.newBuilder().setValue("Myriad"));
+  }
+  public OfferBuilder(String hostname) {
+    offer.setHostname(hostname);
+    offer.setId(Protos.OfferID.newBuilder().setValue("test"));
+    offer.setSlaveId(Protos.SlaveID.newBuilder().setValue("agent"));
+    offer.setFrameworkId(Protos.FrameworkID.newBuilder().setValue("Myriad"));
+  }
+
+  public OfferBuilder addScalarResource(String name, double value) {
+    offer.addAllResources(Collections.singleton(createScalarResource(name, 
value)));
+    return this;
+  }
+
+  public OfferBuilder addScalarResource(String name, String role, double 
value) {
+    offer.addAllResources(Collections.singleton(createScalarResource(name, 
role, value)));
+    return this;
+  }
+
+  public OfferBuilder addRangeResource(String name, long begin, long end) {
+    offer.addAllResources(Collections.singleton(createRangeResource(name, 
begin, end)));
+    return this;
+  }
+
+  public OfferBuilder addRangeResource(String name, String role, long begin, 
long end) {
+    offer.addAllResources(Collections.singleton(createRangeResource(name, 
role, begin, end)));
+    return this;
+  }
+
+  public Protos.Offer build() {
+    return offer.build();
+  }
+
+  private static Protos.Resource createScalarResource(String name, String 
role, double value) {
+    return Protos.Resource.newBuilder()
+        .setScalar(Protos.Value.Scalar.newBuilder().setValue(value))
+        .setType(Protos.Value.Type.SCALAR)
+        .setRole(role)
+        .setName(name)
+        .build();
+  }
+
+  private static Protos.Resource createScalarResource(String name, double 
value) {
+    return Protos.Resource.newBuilder()
+        .setScalar(Protos.Value.Scalar.newBuilder().setValue(value))
+        .setType(Protos.Value.Type.SCALAR)
+        .setName(name)
+        .build();
+  }
+
+  private static Protos.Resource createRangeResource(String name, long begin, 
long end) {
+    return Protos.Resource.newBuilder()
+        .setName(name)
+        .setType(Protos.Value.Type.RANGES)
+        .setRanges(Protos.Value.Ranges.newBuilder()
+            .addRange(Protos.Value.Range.newBuilder()
+                .setBegin(begin)
+                .setEnd(end)
+                .build())
+            .build())
+        .build();
+  }
+
+  private static Protos.Resource createRangeResource(String name, String role, 
long begin, long end) {
+    return Protos.Resource.newBuilder()
+        .setName(name)
+        .setType(Protos.Value.Type.RANGES)
+        .setRole(role)
+        .setRanges(Protos.Value.Ranges.newBuilder()
+            .addRange(Protos.Value.Range.newBuilder()
+                .setBegin(begin)
+                .setEnd(end)
+                .build())
+            .build())
+        .build();
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/7aea259c/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/resource/TestResourceOfferContainer.java
----------------------------------------------------------------------
diff --git 
a/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/resource/TestResourceOfferContainer.java
 
b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/resource/TestResourceOfferContainer.java
new file mode 100644
index 0000000..d54cc7a
--- /dev/null
+++ 
b/myriad-scheduler/src/test/java/org/apache/myriad/scheduler/resource/TestResourceOfferContainer.java
@@ -0,0 +1,166 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myriad.scheduler.resource;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import org.apache.mesos.Protos;
+import org.apache.myriad.configuration.MyriadConfiguration;
+import org.apache.myriad.scheduler.ExtendedResourceProfile;
+import org.apache.myriad.scheduler.NMProfile;
+import org.apache.myriad.scheduler.ServiceResourceProfile;
+import org.apache.myriad.scheduler.offer.OfferBuilder;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests for ResourceOfferContainerClass
+ */
+public class TestResourceOfferContainer {
+  static MyriadConfiguration cfg;
+  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);
+  }
+
+  @Test
+  public void testResouceOfferContainerForNMWithOutRole() {
+    Protos.Offer offer = new OfferBuilder("test.com")
+        .addScalarResource("cpus", 4.0)
+        .addScalarResource("mem", 8000)
+        .addRangeResource("ports", 3500, 3600)
+        .build();
+    Map<String, Long> ports = new HashMap<>(4);
+    ports.put("test1.address", 0L);
+    ports.put("test2.address", 0L);
+    ports.put("test3.address", 0L);
+    ports.put("test4.port", 3501L);
+    ServiceResourceProfile profile1 = new ExtendedResourceProfile(new 
NMProfile("small", 2L, 6000L), .2, 1024.0, ports);
+    ResourceOfferContainer roc = new ResourceOfferContainer(offer, profile1, 
"");
+    System.out.print(roc.getCpus());
+    System.out.print(roc.getMem());
+    System.out.print(roc.getPorts());
+    assertTrue(roc.getHostName().equals("test.com"));
+    assertTrue("Should be satisfied if offer contains request", 
roc.satisfies(profile1));
+    ServiceResourceProfile profile2 = new ExtendedResourceProfile(new 
NMProfile("tooMuchCpu", 7L, 8000L), .2, 1024.0, ports);
+    roc = new ResourceOfferContainer(offer, profile2, "");
+    assertFalse("Should be unsatisfied if too much cpu requested", 
roc.satisfies(profile2));
+    ServiceResourceProfile profile3 = new ExtendedResourceProfile(new 
NMProfile("tooMuchMem", 3L, 50000L), .2, 1024.0, ports);
+    roc = new ResourceOfferContainer(offer, profile3, "");
+    assertFalse("Should be unsatisfied if too much memory requested", 
roc.satisfies(profile3));
+    ports.put("test.bad.address", 1500L);
+    ServiceResourceProfile profile4 = new ExtendedResourceProfile(new 
NMProfile("portOutOfRange", 3L, 50000L), .2, 1024.0, ports);
+    roc = new ResourceOfferContainer(offer, profile4, "");
+    assertFalse("Should be unsatisfied if port not in range", 
roc.satisfies(profile4));
+    List<Protos.Resource> resourcesCpu = roc.consumeCpus(3.0);
+    assertTrue("Should get a list of resources of size 1", resourcesCpu.size() 
== 1.0);
+    assertTrue("Cpus should be decreased", roc.getCpus() == 1.0);
+    List<Protos.Resource> resourcesMem = roc.consumeMem(7000.0);
+    assertTrue("Should get a list of resources of size 1", resourcesMem.size() 
== 1);
+    assertTrue("Mem should be decreased", roc.getMem() == 1000.0);
+  }
+
+  @Test
+  public void testResouceOfferContainerForNMWithRole() {
+    Protos.Offer offer = new OfferBuilder("test.com")
+        .addScalarResource("cpus", 2.0)
+        .addScalarResource("mem", 8000)
+        .addScalarResource("cpus", "test", 4.0)
+        .addScalarResource("mem", "test", 32000.0)
+        .addRangeResource("ports", 3500, 3600)
+        .addRangeResource("ports", "test", 1500, 1600)
+        .build();
+    Map<String, Long> ports = new HashMap<>(4);
+    ports.put("test1.address", 0L);
+    ports.put("test2.address", 0L);
+    ports.put("test3.address", 1500L);
+    ports.put("test4.port", 3502L);
+    ServiceResourceProfile profile1 = new ExtendedResourceProfile(new 
NMProfile("small", 2L, 8000L), .2, 1024.0, ports);
+    ResourceOfferContainer roc = new ResourceOfferContainer(offer, profile1, 
"test");
+    assertTrue(roc.getHostName().equals("test.com"));
+    assertTrue("Should be satisfied if offer contains request", 
roc.satisfies(profile1));
+    ServiceResourceProfile profile2 = new ExtendedResourceProfile(new 
NMProfile("tooMuchCpu", 7L, 8000L), .2, 1024.0, ports);
+    roc = new ResourceOfferContainer(offer, profile2, "test");
+    assertFalse("Should be unsatisfied if too much cpu requested", 
roc.satisfies(profile2));
+    ServiceResourceProfile profile3 = new ExtendedResourceProfile(new 
NMProfile("tooMuchMem", 3L, 50000L), .2, 1024.0, ports);
+    roc = new ResourceOfferContainer(offer, profile3, "test");
+    assertFalse("Should be unsatisfied if too much memory requested", 
roc.satisfies(profile3));
+    ports.put("test.bad.address", 32000L);
+    ServiceResourceProfile profile4 = new ExtendedResourceProfile(new 
NMProfile("portOutOfRange", 3L, 50000L), .2, 1024.0, ports);
+    roc = new ResourceOfferContainer(offer, profile4, "test");
+    assertFalse("Should be unsatisfied if port not in range", 
roc.satisfies(profile4));
+    List<Protos.Resource> resources = roc.consumeCpus(4.5);
+    assertTrue("Resource List should be of size to when requesting 4.1 cpus", 
(resources.size() == 2));
+    assertTrue("Cpus should be decreased", roc.getCpus() <= 1.5);
+    List<Protos.Resource> resources1 = roc.consumeCpus(1.5);
+    assertTrue("Resource List should be of size 1", resources1.size() == 1);
+    assertTrue("All cpu resources should be consumed", roc.getCpus() <= 0.0);
+  }
+
+  @Test
+  public void testResourceOfferContainerForAuxServiceWithOutRole() {
+    Protos.Offer offer = new OfferBuilder("test.com")
+        .addScalarResource("cpus", 2.0)
+        .addScalarResource("mem", 8000)
+        .addRangeResource("ports", 3500, 3600)
+        .build();
+    Map<String, Long> ports = new HashMap<>(4);
+    ports.put("test1.address", 0L);
+    ports.put("test2.address", 0L);
+    ports.put("test3.address", 0L);
+    ports.put("test4.port", 3501L);
+    ServiceResourceProfile profile = new ServiceResourceProfile("jobhistory", 
2.0, 8000.0, ports);
+    ResourceOfferContainer roc = new ResourceOfferContainer(offer, profile, 
null);
+    assertTrue(roc.getHostName().equals("test.com"));
+    assertTrue("Should be satisfied if offer contains request", 
roc.satisfies(profile));
+  }
+
+  @Test
+  public void testResourceOfferContainerForAuxServiceWithRole() {
+    Protos.Offer offer = new OfferBuilder("test.com")
+        .addScalarResource("cpus", 2.0)
+        .addScalarResource("mem", 8000)
+        .addScalarResource("cpus", "test", 4.0)
+        .addScalarResource("mem", "test", 32000.0)
+        .addRangeResource("ports", 3500, 3600)
+        .addRangeResource("ports", "test", 1500, 1600)
+        .build();
+    Map<String, Long> ports = new HashMap<>(4);
+    ports.put("test1.address", 0L);
+    ports.put("test2.address", 0L);
+    ports.put("test3.address", 1500L);
+    ports.put("test4.port", 3501L);
+    ServiceResourceProfile profile = new ServiceResourceProfile("jobhistory", 
2.0, 8000.0, ports);
+    ResourceOfferContainer roc = new ResourceOfferContainer(offer, profile, 
null);
+    assertTrue(roc.getHostName().equals("test.com"));
+    assertTrue("Should be satisfied if offer contains request", 
roc.satisfies(profile));
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/7aea259c/myriad-scheduler/src/test/java/org/apache/myriad/state/ClusterTest.java
----------------------------------------------------------------------
diff --git 
a/myriad-scheduler/src/test/java/org/apache/myriad/state/ClusterTest.java 
b/myriad-scheduler/src/test/java/org/apache/myriad/state/ClusterTest.java
index 69954b7..09145a2 100644
--- a/myriad-scheduler/src/test/java/org/apache/myriad/state/ClusterTest.java
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/state/ClusterTest.java
@@ -7,6 +7,8 @@ import org.apache.myriad.scheduler.constraints.LikeConstraint;
 import org.junit.Before;
 import org.junit.Test;
 
+import java.util.TreeMap;
+
 /**
  * Unit tests for Cluster
  */
@@ -16,15 +18,16 @@ public class ClusterTest {
 
   @Before
   public void setUp() throws Exception {
+    TreeMap<String, Long> ports = new TreeMap<>();
     cluster = new Cluster();
     cluster.setClusterName("test-cluster");
     cluster.setMinQuota(5.0);
     cluster.setResourceManagerHost("localhost");
     cluster.setResourceManagerPort("8192");
 
-    task1 = new NodeTask(new ServiceResourceProfile("profile1", 0.1, 1024.0), 
new LikeConstraint("hostname1", "host-[0-9]*.example1.com"));
-    task2 = new NodeTask(new ServiceResourceProfile("profile2", 0.2, 1024.0), 
new LikeConstraint("hostname2", "host-[0-9]*.example2.com"));
-    task3 = new NodeTask(new ServiceResourceProfile("profile3", 0.3, 1024.0), 
new LikeConstraint("hostname3", "host-[0-9]*.example3.com"));
+    task1 = new NodeTask(new ServiceResourceProfile("profile1", 0.1, 1024.0, 
ports), new LikeConstraint("hostname1", "host-[0-9]*.example1.com"));
+    task2 = new NodeTask(new ServiceResourceProfile("profile2", 0.2, 1024.0, 
ports), new LikeConstraint("hostname2", "host-[0-9]*.example2.com"));
+    task3 = new NodeTask(new ServiceResourceProfile("profile3", 0.3, 1024.0, 
ports), new LikeConstraint("hostname3", "host-[0-9]*.example3.com"));
   }
 
   private void resetCluster() throws Exception {

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/7aea259c/myriad-scheduler/src/test/java/org/apache/myriad/state/NodeTaskTest.java
----------------------------------------------------------------------
diff --git 
a/myriad-scheduler/src/test/java/org/apache/myriad/state/NodeTaskTest.java 
b/myriad-scheduler/src/test/java/org/apache/myriad/state/NodeTaskTest.java
index d3cf2fe..3f486c0 100644
--- a/myriad-scheduler/src/test/java/org/apache/myriad/state/NodeTaskTest.java
+++ b/myriad-scheduler/src/test/java/org/apache/myriad/state/NodeTaskTest.java
@@ -6,6 +6,8 @@ import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
+import java.util.TreeMap;
+
 /**
  * Unit test cases for NodeTask
  */
@@ -13,12 +15,13 @@ public class NodeTaskTest {
   NodeTask task;
 
   @Before
-  public void setUp() throws Exception {    
-    task = new NodeTask(new ServiceResourceProfile("profile", 0.1, 1024.0), 
new LikeConstraint("hostname", "host-[0-9]*.example.com"));
+  public void setUp() throws Exception {
+    TreeMap<String, Long> ports = new TreeMap<>();
+    task = new NodeTask(new ServiceResourceProfile("profile", 0.1, 1024.0, 
ports), new LikeConstraint("hostname", "host-[0-9]*.example.com"));
     
     task.setHostname("localhost");
     task.setTaskPrefix("prefix");
-    task.setProfile(new ServiceResourceProfile("ServiceResourceProfile", 0.1, 
1024.0, 0.1, 512.0));
+    task.setProfile(new ServiceResourceProfile("ServiceResourceProfile", 0.1, 
1024.0, ports));
   }
   
   @Test

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/7aea259c/myriad-scheduler/src/test/java/org/apache/myriad/state/SchedulerStateTest.java
----------------------------------------------------------------------
diff --git 
a/myriad-scheduler/src/test/java/org/apache/myriad/state/SchedulerStateTest.java
 
b/myriad-scheduler/src/test/java/org/apache/myriad/state/SchedulerStateTest.java
index 59e2d41..cd4a12e 100644
--- 
a/myriad-scheduler/src/test/java/org/apache/myriad/state/SchedulerStateTest.java
+++ 
b/myriad-scheduler/src/test/java/org/apache/myriad/state/SchedulerStateTest.java
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 
 import java.util.Set;
+import java.util.TreeMap;
 
 import org.apache.hadoop.conf.Configuration;
 import 
org.apache.hadoop.yarn.server.resourcemanager.recovery.MyriadFileSystemRMStateStore;
@@ -38,8 +39,8 @@ public class SchedulerStateTest {
   
   @Test
   public void testAddAndRemoveTask() throws Exception {
-    NodeTask task1 = new NodeTask(new ServiceResourceProfile("profile1", 0.1, 
1024.0), new LikeConstraint("hostname", "host-[0-9]*.example.com"));
-    NodeTask task2 = new NodeTask(new ServiceResourceProfile("profile2", 0.1, 
1024.0), new LikeConstraint("hostname", "host-[0-9]*.example.com"));
+    NodeTask task1 = new NodeTask(new ServiceResourceProfile("profile1", 0.1, 
1024.0, new TreeMap<String, Long>()), new LikeConstraint("hostname", 
"host-[0-9]*.example.com"));
+    NodeTask task2 = new NodeTask(new ServiceResourceProfile("profile2", 0.1, 
1024.0, new TreeMap<String, Long>()), new LikeConstraint("hostname", 
"host-[0-9]*.example.com"));
     TaskID id1 = TaskID.newBuilder().setValue("mock-task-1").build();
     TaskID id2 = TaskID.newBuilder().setValue("mock-task-2").build();
     

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/7aea259c/myriad-scheduler/src/test/java/org/apache/myriad/state/utils/ByteBufferSupportTest.java
----------------------------------------------------------------------
diff --git 
a/myriad-scheduler/src/test/java/org/apache/myriad/state/utils/ByteBufferSupportTest.java
 
b/myriad-scheduler/src/test/java/org/apache/myriad/state/utils/ByteBufferSupportTest.java
index 6794ec2..9d4dac5 100644
--- 
a/myriad-scheduler/src/test/java/org/apache/myriad/state/utils/ByteBufferSupportTest.java
+++ 
b/myriad-scheduler/src/test/java/org/apache/myriad/state/utils/ByteBufferSupportTest.java
@@ -5,7 +5,7 @@ import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayOutputStream;
 import java.nio.ByteBuffer;
-import java.util.List;
+import java.util.*;
 
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.mesos.Protos;
@@ -33,7 +33,8 @@ public class ByteBufferSupportTest {
 
   @Before
   public void setUp() throws Exception {
-    task = new NodeTask(new ServiceResourceProfile("profile", 0.1, 1024.0), 
new LikeConstraint("hostname", "host-[0-9]*.example.com"));    
+    task = new NodeTask(new ServiceResourceProfile("profile", 0.1, 1024.0, new 
TreeMap<String, Long>()),
+        new LikeConstraint("hostname", "host-[0-9]*.example.com"));
     task.setHostname("localhost");
     task.setTaskPrefix("prefix"); 
     task.setExecutorInfo(getExecutorInfo());

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/7aea259c/myriad-scheduler/src/test/resources/myriad-config-test-default-with-docker-info.yml
----------------------------------------------------------------------
diff --git 
a/myriad-scheduler/src/test/resources/myriad-config-test-default-with-docker-info.yml
 
b/myriad-scheduler/src/test/resources/myriad-config-test-default-with-docker-info.yml
index 4bdb6e2..cd72c18 100644
--- 
a/myriad-scheduler/src/test/resources/myriad-config-test-default-with-docker-info.yml
+++ 
b/myriad-scheduler/src/test/resources/myriad-config-test-default-with-docker-info.yml
@@ -63,6 +63,7 @@ services:
      myriad.mapreduce.jobhistory.webapp.address: 0
    envSettings: -Dcluster.name.prefix=/mycluster
    taskName: jobhistory
+   command: bin/mapred historyserver
  timelineserver:
    jvmMaxMemoryMB: 1024
    cpus: 1

http://git-wip-us.apache.org/repos/asf/incubator-myriad/blob/7aea259c/myriad-scheduler/src/test/resources/myriad-config-test-default.yml
----------------------------------------------------------------------
diff --git a/myriad-scheduler/src/test/resources/myriad-config-test-default.yml 
b/myriad-scheduler/src/test/resources/myriad-config-test-default.yml
index f6f6b58..d07a318 100644
--- a/myriad-scheduler/src/test/resources/myriad-config-test-default.yml
+++ b/myriad-scheduler/src/test/resources/myriad-config-test-default.yml
@@ -60,18 +60,20 @@ yarnEnvironment:
 mesosAuthenticationPrincipal:
 mesosAuthenticationSecretFilename:
 services:
-   jobhistory:  
-     maxInstances: 1
-     jvmMaxMemoryMB: 1024
-     cpus: 1
-     ports:
-       myriad.mapreduce.jobhistory.admin.address: 0
-       myriad.mapreduce.jobhistory.address: 0
-       myriad.mapreduce.jobhistory.webapp.address: 0
-     envSettings: -Dcluster.name.prefix=/mycluster
-     taskName: jobhistory
-   timelineserver:
-     jvmMaxMemoryMB: 1024
-     cpus: 1
-     envSettings: -Dcluster.name.prefix=/mycluster2
-     taskName: timelineserver  
+  jobhistory:
+    maxInstances: 1
+    jvmMaxMemoryMB: 1024
+    cpus: 1
+    ports:
+      myriad.mapreduce.jobhistory.admin.address: 0
+      myriad.mapreduce.jobhistory.address: 0
+      myriad.mapreduce.jobhistory.webapp.address: 1
+    command: bin/mapred historyserver
+    envSettings: -Dcluster.name.prefix=/mycluster
+    taskName: jobhistory
+  timelineserver:
+    jvmMaxMemoryMB: 1024
+    cpus: 1
+    envSettings: -Dcluster.name.prefix=/mycluster2
+    taskName: timelineserver
+    command: bin/mapred historyserver


Reply via email to