Skip to content

Commit

Permalink
Merge pull request #352 from mwl/refactor/352-scheduler-driver-mocking
Browse files Browse the repository at this point in the history
ElasticsearchSchedulerTest fails because schedulerDriver is instantiated instead of mocked
  • Loading branch information
mwl committed Nov 4, 2015
2 parents d79e036 + 76c5cde commit 0eabd85
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 35 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.apache.mesos.elasticsearch.scheduler;

import org.apache.log4j.Logger;
import org.apache.mesos.MesosSchedulerDriver;
import org.apache.mesos.Protos;
import org.apache.mesos.Scheduler;
import org.apache.mesos.SchedulerDriver;
Expand All @@ -22,7 +21,6 @@ public class ElasticsearchScheduler implements Scheduler {

private final Configuration configuration;
private final TaskInfoFactory taskInfoFactory;
private final CredentialFactory credentialFactory;
private final ClusterState clusterState;
private FrameworkState frameworkState;
private OfferStrategy offerStrategy;
Expand All @@ -35,7 +33,6 @@ public ElasticsearchScheduler(Configuration configuration, FrameworkState framew
this.taskInfoFactory = taskInfoFactory;
this.offerStrategy = offerStrategy;
this.zookeeperStateDriver = zookeeperStateDriver;
this.credentialFactory = new CredentialFactory(configuration);
}

public Map<String, Task> getTasks() {
Expand All @@ -46,24 +43,13 @@ public Map<String, Task> getTasks() {
}
}

public void run() {
public void run(SchedulerDriver schedulerDriver) {
LOGGER.info("Starting ElasticSearch on Mesos - [numHwNodes: " + configuration.getElasticsearchNodes() +
", zk mesos: " + configuration.getMesosZKURL() +
", zk framework: " + configuration.getFrameworkZKURL() +
", ram:" + configuration.getMem() + "]");

FrameworkInfoFactory frameworkInfoFactory = new FrameworkInfoFactory(configuration, frameworkState);
final Protos.FrameworkInfo.Builder frameworkBuilder = frameworkInfoFactory.getBuilder();
final Protos.Credential.Builder credentialBuilder = credentialFactory.getBuilder();
final MesosSchedulerDriver driver;
if (credentialBuilder.isInitialized()) {
LOGGER.debug("Creating Scheduler driver with principal: " + credentialBuilder.toString());
driver = new MesosSchedulerDriver(this, frameworkBuilder.build(), configuration.getMesosZKURL(), credentialBuilder.build());
} else {
driver = new MesosSchedulerDriver(this, frameworkBuilder.build(), configuration.getMesosZKURL());
}

driver.run();
schedulerDriver.run();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package org.apache.mesos.elasticsearch.scheduler;

import org.apache.log4j.Logger;
import org.apache.mesos.MesosSchedulerDriver;
import org.apache.mesos.Protos;
import org.apache.mesos.elasticsearch.scheduler.cluster.ClusterMonitor;
import org.apache.mesos.elasticsearch.scheduler.state.ClusterState;
import org.apache.mesos.elasticsearch.scheduler.state.FrameworkState;
Expand All @@ -15,6 +18,8 @@
* Application which starts the Elasticsearch scheduler
*/
public class Main {
private static final Logger LOGGER = Logger.getLogger(Main.class);

private final Environment env;
private Configuration configuration;

Expand Down Expand Up @@ -57,10 +62,21 @@ public void run(String[] args) {
clusterState,
taskInfoFactory,
new OfferStrategy(configuration, clusterState),
zookeeperStateDriver
);
zookeeperStateDriver);
new ClusterMonitor(configuration, frameworkState, zookeeperStateDriver, scheduler);


FrameworkInfoFactory frameworkInfoFactory = new FrameworkInfoFactory(configuration, frameworkState);
final Protos.FrameworkInfo.Builder frameworkBuilder = frameworkInfoFactory.getBuilder();
final Protos.Credential.Builder credentialBuilder = new CredentialFactory(configuration).getBuilder();
final MesosSchedulerDriver schedulerDriver;
if (credentialBuilder.isInitialized()) {
LOGGER.debug("Creating Scheduler driver with principal: " + credentialBuilder.toString());
schedulerDriver = new MesosSchedulerDriver(scheduler, frameworkBuilder.build(), configuration.getMesosZKURL(), credentialBuilder.build());
} else {
schedulerDriver = new MesosSchedulerDriver(scheduler, frameworkBuilder.build(), configuration.getMesosZKURL());
}

HashMap<String, Object> properties = new HashMap<>();
properties.put("server.port", String.valueOf(configuration.getWebUiPort()));
new SpringApplicationBuilder(WebApplication.class)
Expand All @@ -70,7 +86,7 @@ public void run(String[] args) {
.showBanner(false)
.run(args);

scheduler.run();
scheduler.run(schedulerDriver);
}

private void checkEnv() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public class ElasticsearchSchedulerTest {

private ElasticsearchScheduler scheduler;

private SchedulerDriver driver;
private SchedulerDriver driver = mock(SchedulerDriver.class);

private Protos.FrameworkID frameworkID = Protos.FrameworkID.newBuilder().setValue(UUID.randomUUID().toString()).build();

Expand Down Expand Up @@ -64,12 +64,16 @@ public void before() {

scheduler = new ElasticsearchScheduler(configuration, frameworkState, clusterState, taskInfoFactory, offerStrategy, serializableState);

driver = mock(SchedulerDriver.class);

masterInfo = newMasterInfo();
scheduler.registered(driver, frameworkID, masterInfo);
}

@Test
public void willRunDriver() throws Exception {
scheduler.run(driver);
verify(driver).run();
}

@Test
public void shouldCallObserversWhenExecutorLost() {
Protos.ExecutorID executorID = ProtoTestUtil.getExecutorId();
Expand Down Expand Up @@ -127,19 +131,6 @@ public void testResourceOffers_launchTasks() {
verify(driver).launchTasks(singleton(offer.getId()), singleton(taskInfo));
}

@Test
public void shouldRunWithCredentials() {
when(configuration.getFrameworkPrincipal()).thenReturn("user1");
when(configuration.getFrameworkSecretPath()).thenReturn("/etc/passwd");
try {
scheduler.run();
} catch (java.lang.UnsatisfiedLinkError e) {
LOGGER.info("This error is normal. Don't worry.");
}
verify(configuration, atLeastOnce()).getFrameworkPrincipal();
verify(configuration, atLeastOnce()).getFrameworkSecretPath();
}

private Protos.Offer.Builder newOffer(String hostname) {
return newOfferBuilder(UUID.randomUUID().toString(), hostname, UUID.randomUUID().toString(), frameworkID);
}
Expand Down

0 comments on commit 0eabd85

Please sign in to comment.