You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by vi...@apache.org on 2013/09/20 09:36:16 UTC
git commit: Moved Jenkins out of the repo to
https://github.com/jenkinsci/mesos-plugin.
Updated Branches:
refs/heads/master 4cb7b74d1 -> e54a79529
Moved Jenkins out of the repo to
https://github.com/jenkinsci/mesos-plugin.
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/e54a7952
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/e54a7952
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/e54a7952
Branch: refs/heads/master
Commit: e54a7952959fa458fbbee97d25d7a10797172d73
Parents: 4cb7b74
Author: Vinod Kone <vi...@twitter.com>
Authored: Fri Sep 20 00:34:31 2013 -0700
Committer: Vinod Kone <vi...@twitter.com>
Committed: Fri Sep 20 00:34:31 2013 -0700
----------------------------------------------------------------------
jenkins/Makefile.am | 69 ----
jenkins/README.md | 53 ---
jenkins/pom.xml.in | 80 -----
.../plugins/mesos/JenkinsScheduler.java | 355 -------------------
.../java/org/jenkinsci/plugins/mesos/Mesos.java | 105 ------
.../org/jenkinsci/plugins/mesos/MesosCloud.java | 215 -----------
.../jenkinsci/plugins/mesos/MesosComputer.java | 28 --
.../plugins/mesos/MesosComputerLauncher.java | 111 ------
.../plugins/mesos/MesosRetentionStrategy.java | 84 -----
.../org/jenkinsci/plugins/mesos/MesosSlave.java | 103 ------
jenkins/src/main/resources/index.jelly | 7 -
.../plugins/mesos/MesosCloud/config.jelly | 38 --
.../plugins/mesos/MesosCloud/help-master.html | 3 -
.../mesos/MesosSlave/configure-entries.jelly | 15 -
14 files changed, 1266 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/e54a7952/jenkins/Makefile.am
----------------------------------------------------------------------
diff --git a/jenkins/Makefile.am b/jenkins/Makefile.am
deleted file mode 100644
index 6b89e75..0000000
--- a/jenkins/Makefile.am
+++ /dev/null
@@ -1,69 +0,0 @@
-# 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
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License
-
-EXTRA_DIST = README.md \
- pom.xml \
- src/main/java/org/jenkinsci/plugins/mesos/JenkinsScheduler.java \
- src/main/java/org/jenkinsci/plugins/mesos/Mesos.java \
- src/main/java/org/jenkinsci/plugins/mesos/MesosCloud.java \
- src/main/java/org/jenkinsci/plugins/mesos/MesosComputer.java \
- src/main/java/org/jenkinsci/plugins/mesos/MesosComputerLauncher.java \
- src/main/java/org/jenkinsci/plugins/mesos/MesosRetentionStrategy.java \
- src/main/java/org/jenkinsci/plugins/mesos/MesosSlave.java \
- src/main/resources/index.jelly \
- src/main/resources/org/jenkinsci/plugins/mesos/MesosCloud/config.jelly \
- src/main/resources/org/jenkinsci/plugins/mesos/MesosCloud/help-master.html \
- src/main/resources/org/jenkinsci/plugins/mesos/MesosSlave/configure-entries.jelly
-
-
-if OS_LINUX
- MESOS_LIBRARY = libmesos.so
-else
- MESOS_LIBRARY = libmesos.dylib
-endif
-TARGET_LIBS_DIR = src/main/webapp
-
-
-$(MESOS_LIBRARY):
- @cd $(abs_top_builddir) && $(MAKE) $(AM_MAKEFLAGS);
-
-
-MESOS_JAR = mesos-$(PACKAGE_VERSION).jar
-
-
-$(MESOS_JAR):
- @cd $(abs_top_builddir)/src && $(MAKE) $(AM_MAKEFLAGS) maven-install;
-
-
-# Defines a target to build the Jenkins plugin for Mesos.
-# This will create ./target/mesos.hpi that you can deploy to Jenkins.
-jenkins: $(MESOS_LIBRARY) $(MESOS_JAR)
- if test "$(top_srcdir)" != "$(top_builddir)"; then \
- cp -rp $(srcdir)/src .; \
- fi
- mkdir -p $(TARGET_LIBS_DIR) && \
- cp $(abs_top_builddir)/src/.libs/$(MESOS_LIBRARY) $(TARGET_LIBS_DIR) && \
- mvn package
-
-
-clean-local:
- if test "$(top_srcdir)" != "$(top_builddir)"; then \
- rm -rf src; \
- fi
- rm -rf target work;
-
-
-.PHONY: jenkins
http://git-wip-us.apache.org/repos/asf/mesos/blob/e54a7952/jenkins/README.md
----------------------------------------------------------------------
diff --git a/jenkins/README.md b/jenkins/README.md
deleted file mode 100644
index 4d6e154..0000000
--- a/jenkins/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-Jenkins on Mesos
-----------------
-
-This Jenkins plugin allows Jenkins to dynamically launch Jenkins slaves on a
-Mesos cluster depending on the workload!
-
-### Building the plugin ###
-
-First configure the jenkins target:
-
- $ ./bootstrap
- $ mkdir -p build && cd build
- $ ../configure
-
-Now build the plugin:
-
- $ cd jenkins
- $ make jenkins
-
-This should build the Mesos plugin (mesos.hpi) in the 'target' folder.
-
-
-### Installing the plugin ###
-
-Go to 'Manage Plugins' page in Jenkins Web UI and manually upload and
-install the plugin.
-
-Alternatively, you can just copy the plugin to your Jenkins plugins directory
-(this might need a restart of Jenkins).
-
- $ cp target/mesos.hpi ${JENKINS_HOME}/plugins
-
-
-### Configuring the plugin ###
-
-Now go to 'Configure' page in Jenkins. If the plugin is successfully installed
-you should see an option to 'Add a new cloud' at the bottom of the page. Add
-the 'Mesos Cloud' and give it the address (HOST:PORT) of a running Mesos master.
-Click 'Save' for the plugin to connect to Mesos.
-
-Login to the Mesos master's Web UI to verify that the plugin is registered as
-'Jenkins Framework'.
-
-
-### Configuring Jenkins jobs ###
-
-Finally, just add 'mesos' label to the jobs that you want to be run on a
-Jenkins slave launched on Mesos.
-
-Thats it!
-
-
-_Please email user@mesos.apache.org with questions!_
http://git-wip-us.apache.org/repos/asf/mesos/blob/e54a7952/jenkins/pom.xml.in
----------------------------------------------------------------------
diff --git a/jenkins/pom.xml.in b/jenkins/pom.xml.in
deleted file mode 100644
index 6f76c49..0000000
--- a/jenkins/pom.xml.in
+++ /dev/null
@@ -1,80 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.jenkins-ci.plugins</groupId>
- <artifactId>plugin</artifactId>
- <version>1.509.1</version><!-- which version of Jenkins is this plugin built against? -->
- </parent>
-
- <groupId>org.jenkins-ci.plugins</groupId>
- <artifactId>mesos</artifactId>
- <version>0.1-SNAPSHOT</version>
- <packaging>hpi</packaging>
-
- <!-- get every artifact through repo.jenkins-ci.org, which proxies all the artifacts that we need -->
- <repositories>
- <repository>
- <id>repo.jenkins-ci.org</id>
- <url>http://repo.jenkins-ci.org/public/</url>
- </repository>
- </repositories>
-
- <pluginRepositories>
- <pluginRepository>
- <id>repo.jenkins-ci.org</id>
- <url>http://repo.jenkins-ci.org/public/</url>
- </pluginRepository>
- </pluginRepositories>
-
- <properties>
- <!--
- explicitly specifying the latest version here because one we get from the parent POM
- tends to lag behind a bit
- -->
- <maven-hpi-plugin.version>1.95</maven-hpi-plugin.version>
- </properties>
-
- <!-- NOTE: Need to run jenkins by providing the mesos lib path. -->
- <!-- $ MESOS_NATIVE_LIBRARY=/path/to/libmesos.dylib mvn hpi:run -->
- <dependencies>
- <dependency>
- <groupId>org.apache.mesos</groupId>
- <artifactId>mesos</artifactId>
- <version>@PACKAGE_VERSION@</version>
- </dependency>
- <dependency>
- <groupId>com.google.protobuf</groupId>
- <artifactId>protobuf-java</artifactId>
- <version>2.4.1</version>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <executions>
- <execution>
- <id>copy-dependencies</id>
- <phase>package</phase>
- <goals>
- <goal>copy-dependencies</goal>
- </goals>
- <configuration>
- <outputDirectory>${project.build.directory}</outputDirectory>
- <overWriteReleases>false</overWriteReleases>
- <overWriteSnapshots>true</overWriteSnapshots>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <artifactId>maven-compiler-plugin</artifactId>
- <configuration>
- <target>1.6</target>
- </configuration>
- </plugin>
- </plugins>
- </build>
-</project>
http://git-wip-us.apache.org/repos/asf/mesos/blob/e54a7952/jenkins/src/main/java/org/jenkinsci/plugins/mesos/JenkinsScheduler.java
----------------------------------------------------------------------
diff --git a/jenkins/src/main/java/org/jenkinsci/plugins/mesos/JenkinsScheduler.java b/jenkins/src/main/java/org/jenkinsci/plugins/mesos/JenkinsScheduler.java
deleted file mode 100644
index a52fc0f..0000000
--- a/jenkins/src/main/java/org/jenkinsci/plugins/mesos/JenkinsScheduler.java
+++ /dev/null
@@ -1,355 +0,0 @@
-package org.jenkinsci.plugins.mesos;
-
-import java.net.URL;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Queue;
-import java.util.logging.Logger;
-
-import jenkins.model.Jenkins;
-
-import org.apache.mesos.MesosSchedulerDriver;
-import org.apache.mesos.MesosNativeLibrary;
-import org.apache.mesos.Protos.CommandInfo;
-import org.apache.mesos.Protos.ExecutorID;
-import org.apache.mesos.Protos.Filters;
-import org.apache.mesos.Protos.FrameworkID;
-import org.apache.mesos.Protos.FrameworkInfo;
-import org.apache.mesos.Protos.MasterInfo;
-import org.apache.mesos.Protos.Offer;
-import org.apache.mesos.Protos.OfferID;
-import org.apache.mesos.Protos.Resource;
-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.Protos.Value;
-import org.apache.mesos.Scheduler;
-import org.apache.mesos.SchedulerDriver;
-
-public class JenkinsScheduler implements Scheduler {
- private static final String SLAVE_JAR_URI_SUFFIX = "jnlpJars/slave.jar";
-
- // We allocate 10% more memory to the Mesos task to account for the JVM overhead.
- private static final double JVM_MEM_OVERHEAD_FACTOR = 0.1;
-
- private static final String SLAVE_COMMAND_FORMAT =
- "java -DHUDSON_HOME=jenkins -server -Xmx%dm -Xms16m -XX:+UseConcMarkSweepGC " +
- "-Djava.net.preferIPv4Stack=true -jar slave.jar -jnlpUrl %s";
-
- private Queue<Request> requests;
- private Map<TaskID, Result> results;
- private volatile MesosSchedulerDriver driver;
- private final String jenkinsMaster;
- private final String mesosMaster;
-
- private static final Logger LOGGER = Logger.getLogger(JenkinsScheduler.class.getName());
-
- public JenkinsScheduler(String jenkinsMaster, String mesosMaster) {
- LOGGER.info("JenkinsScheduler instantiated with jenkins " + jenkinsMaster +
- " and mesos " + mesosMaster);
-
- this.jenkinsMaster = jenkinsMaster;
- this.mesosMaster = mesosMaster;
-
- requests = new LinkedList<Request>();
- results = new HashMap<TaskID, Result>();
- }
-
- public synchronized void init() {
- // Load the Mesos native library bundled with the plugin.
- // TODO(vinod): Instead of loading the library here, it would
- // be great if the plugin can dynamically set the MESOS_NATIVE_LIBRARY
- // environment variable or java.library.path system property.
- final URL resourceURL =
- Jenkins.getInstance().getPlugin("mesos").getWrapper().baseResourceURL;
-
- String MESOS_NATIVE_LIBRARY = resourceURL.getPath() + "libmesos.so";
- if (System.getProperty("os.name").indexOf("Mac") >= 0) {
- MESOS_NATIVE_LIBRARY = resourceURL.getPath() + "libmesos.dylib";
- }
-
- // First, we attempt to load the library from the plugin directory.
- // If unsuccessful, we attempt to load using 'MesosNativeLibrary.load()'.
- try {
- MesosNativeLibrary.load(MESOS_NATIVE_LIBRARY);
- } catch (UnsatisfiedLinkError error) {
- LOGGER.warning("Failed to load native Mesos library from '" + MESOS_NATIVE_LIBRARY +
- "': " + error.getMessage());
- MesosNativeLibrary.load();
- }
-
- // Start the framework.
- new Thread(new Runnable() {
- @Override
- public void run() {
- // Have Mesos fill in the current user.
- FrameworkInfo framework = FrameworkInfo.newBuilder().setUser("")
- .setName("Jenkins Framework").build();
-
- driver = new MesosSchedulerDriver(JenkinsScheduler.this, framework, mesosMaster);
-
- if (driver.run() != Status.DRIVER_STOPPED) {
- LOGGER.severe("The mesos driver was aborted!");
- }
-
- driver = null;
- }
- }).start();
- }
-
- public synchronized void stop() {
- driver.stop();
- }
-
- public synchronized boolean isRunning() {
- return driver != null;
- }
-
- public void requestJenkinsSlave(Mesos.SlaveRequest request, Mesos.SlaveResult result) {
- LOGGER.info("Enqueuing jenkins slave request");
- requests.add(new Request(request, result));
- }
-
- /**
- * @param slaveName the slave name in jenkins
- * @return the jnlp url for the slave: http://[master]/computer/[slaveName]/slave-agent.jnlp
- */
- private String getJnlpUrl(String slaveName) {
- return joinPaths(joinPaths(joinPaths(jenkinsMaster, "computer"), slaveName), "slave-agent.jnlp");
- }
-
- private static String joinPaths(String prefix, String suffix) {
- if (prefix.endsWith("/")) prefix = prefix.substring(0, prefix.length()-1);
- if (suffix.startsWith("/")) suffix = suffix.substring(1, suffix.length());
-
- return prefix + '/' + suffix;
- }
-
- public void terminateJenkinsSlave(String name) {
- LOGGER.info("Terminating jenkins slave " + name);
-
- TaskID taskId = TaskID.newBuilder().setValue(name).build();
-
- if (results.containsKey(taskId)) {
- LOGGER.info("Killing mesos task " + taskId);
- driver.killTask(taskId);
- } else {
- LOGGER.warning("Asked to kill unknown mesos task " + taskId);
- }
- }
-
- @Override
- public void registered(SchedulerDriver driver, FrameworkID frameworkId, MasterInfo masterInfo) {
- LOGGER.info("Framework registered! ID = " + frameworkId.getValue());
- }
-
- @Override
- public void reregistered(SchedulerDriver driver, MasterInfo masterInfo) {
- LOGGER.info("Framework re-registered");
- }
-
- @Override
- public void disconnected(SchedulerDriver driver) {
- LOGGER.info("Framework disconnected!");
- }
-
- @Override
- public void resourceOffers(SchedulerDriver driver, List<Offer> offers) {
- LOGGER.info("Received offers " + offers.size());
- for (Offer offer : offers) {
- boolean matched = false;
- for (Request request : requests) {
- if (matches(offer, request)) {
- matched = true;
- LOGGER.info("Offer matched! Creating mesos task");
- createMesosTask(offer, request);
- requests.remove(request);
- break;
- }
- }
-
- if (!matched) {
- driver.declineOffer(offer.getId());
- }
- }
- }
-
- private boolean matches(Offer offer, Request request) {
- double cpus = -1;
- double mem = -1;
-
- for (Resource resource : offer.getResourcesList()) {
- if (resource.getName().equals("cpus")) {
- if (resource.getType().equals(Value.Type.SCALAR)) {
- cpus = resource.getScalar().getValue();
- } else {
- LOGGER.severe("Cpus resource was not a scalar: " + resource.getType().toString());
- }
- } else if (resource.getName().equals("mem")) {
- if (resource.getType().equals(Value.Type.SCALAR)) {
- mem = resource.getScalar().getValue();
- } else {
- LOGGER.severe("Mem resource was not a scalar: " + resource.getType().toString());
- }
- } else if (resource.getName().equals("disk")) {
- LOGGER.warning("Ignoring disk resources from offer");
- } else if (resource.getName().equals("ports")) {
- LOGGER.info("Ignoring ports resources from offer");
- } else {
- LOGGER.warning("Ignoring unknown resource type: " + resource.getName());
- }
- }
-
- if (cpus < 0) LOGGER.severe("No cpus resource present");
- if (mem < 0) LOGGER.severe("No mem resource present");
-
- // Check for sufficient cpu and memory resources in the offer.
- double requestedCpus = request.request.cpus;
- double requestedMem = (1 + JVM_MEM_OVERHEAD_FACTOR) * request.request.mem;
-
- if (requestedCpus <= cpus && requestedMem <= mem) {
- return true;
- } else {
- LOGGER.info(
- "Offer not sufficient for slave request:\n" +
- offer.getResourcesList().toString() +
- "\nRequested for Jenkins slave:\n" +
- " cpus: " + requestedCpus + "\n" +
- " mem: " + requestedMem);
- return false;
- }
- }
-
- private void createMesosTask(Offer offer, Request request) {
- TaskID taskId = TaskID.newBuilder().setValue(request.request.slave.name).build();
-
- LOGGER.info("Launching task " + taskId.getValue() + " with URI " +
- joinPaths(jenkinsMaster, SLAVE_JAR_URI_SUFFIX));
-
- TaskInfo task = TaskInfo
- .newBuilder()
- .setName("task " + taskId.getValue())
- .setTaskId(taskId)
- .setSlaveId(offer.getSlaveId())
- .addResources(
- Resource
- .newBuilder()
- .setName("cpus")
- .setType(Value.Type.SCALAR)
- .setScalar(
- Value.Scalar.newBuilder()
- .setValue(request.request.cpus).build()).build())
- .addResources(
- Resource
- .newBuilder()
- .setName("mem")
- .setType(Value.Type.SCALAR)
- .setScalar(
- Value.Scalar
- .newBuilder()
- .setValue((1 + JVM_MEM_OVERHEAD_FACTOR) * request.request.mem)
- .build()).build())
- .setCommand(
- CommandInfo
- .newBuilder()
- .setValue(
- String.format(SLAVE_COMMAND_FORMAT, request.request.mem,
- getJnlpUrl(request.request.slave.name)))
- .addUris(
- CommandInfo.URI.newBuilder().setValue(
- joinPaths(jenkinsMaster, SLAVE_JAR_URI_SUFFIX)))).build();
-
- List<TaskInfo> tasks = new ArrayList<TaskInfo>();
- tasks.add(task);
- Filters filters = Filters.newBuilder().setRefuseSeconds(1).build();
- driver.launchTasks(offer.getId(), tasks, filters);
-
- results.put(taskId, new Result(request.result, new Mesos.JenkinsSlave(offer.getSlaveId()
- .getValue())));
- }
-
- @Override
- public void offerRescinded(SchedulerDriver driver, OfferID offerId) {
- LOGGER.info("Rescinded offer " + offerId);
- }
-
- @Override
- public void statusUpdate(SchedulerDriver driver, TaskStatus status) {
- TaskID taskId = status.getTaskId();
- LOGGER.info("Status update: task " + taskId + " is in state " + status.getState());
-
- if (!results.containsKey(taskId)) {
- throw new IllegalStateException("Unknown taskId: " + taskId);
- }
-
- Result result = results.get(taskId);
-
- switch (status.getState()) {
- case TASK_STAGING:
- case TASK_STARTING:
- break;
- case TASK_RUNNING:
- result.result.running(result.slave);
- break;
- case TASK_FINISHED:
- result.result.finished(result.slave);
- break;
- case TASK_FAILED:
- case TASK_KILLED:
- case TASK_LOST:
- result.result.failed(result.slave);
- break;
- default:
- throw new IllegalStateException("Invalid State: " + status.getState());
- }
- }
-
- @Override
- public void frameworkMessage(SchedulerDriver driver, ExecutorID executorId,
- SlaveID slaveId, byte[] data) {
- LOGGER.info("Received framework message from executor " + executorId
- + " of slave " + slaveId);
- }
-
- @Override
- public void slaveLost(SchedulerDriver driver, SlaveID slaveId) {
- LOGGER.info("Slave " + slaveId + " lost!");
- }
-
- @Override
- public void executorLost(SchedulerDriver driver, ExecutorID executorId,
- SlaveID slaveId, int status) {
- LOGGER.info("Executor " + executorId + " of slave " + slaveId + " lost!");
- }
-
- @Override
- public void error(SchedulerDriver driver, String message) {
- LOGGER.severe(message);
- }
-
- private class Result {
- private final Mesos.SlaveResult result;
- private final Mesos.JenkinsSlave slave;
-
- private Result(Mesos.SlaveResult result, Mesos.JenkinsSlave slave) {
- this.result = result;
- this.slave = slave;
- }
- }
-
- private class Request {
- private final Mesos.SlaveRequest request;
- private final Mesos.SlaveResult result;
-
- public Request(Mesos.SlaveRequest request, Mesos.SlaveResult result) {
- this.request = request;
- this.result = result;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/mesos/blob/e54a7952/jenkins/src/main/java/org/jenkinsci/plugins/mesos/Mesos.java
----------------------------------------------------------------------
diff --git a/jenkins/src/main/java/org/jenkinsci/plugins/mesos/Mesos.java b/jenkins/src/main/java/org/jenkinsci/plugins/mesos/Mesos.java
deleted file mode 100644
index 61a226e..0000000
--- a/jenkins/src/main/java/org/jenkinsci/plugins/mesos/Mesos.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.jenkinsci.plugins.mesos;
-
-public abstract class Mesos {
- private static MesosImpl mesos;
-
- public static class JenkinsSlave {
- String name;
-
- public JenkinsSlave(String name) {
- this.name = name;
- }
- }
-
- public static class SlaveRequest {
- JenkinsSlave slave;
- final int cpus;
- final int mem;
-
- public SlaveRequest(JenkinsSlave slave, int cpus, int mem) {
- this.slave = slave;
- this.cpus = cpus;
- this.mem = mem;
- }
- }
-
- interface SlaveResult {
- void running(JenkinsSlave slave);
-
- void finished(JenkinsSlave slave);
-
- void failed(JenkinsSlave slave);
- }
-
- abstract public void startScheduler(String jenkinsMaster, String mesosMaster);
- abstract public boolean isSchedulerRunning();
- abstract public void stopScheduler();
-
- /**
- * Starts a jenkins slave asynchronously in the mesos cluster.
- *
- * @param request
- * slave request.
- * @param result
- * this callback will be called when the slave starts.
- */
- abstract public void startJenkinsSlave(SlaveRequest request, SlaveResult result);
-
-
- /**
- * Stop a jenkins slave asynchronously in the mesos cluster.
- *
- * @param name
- * jenkins slave.
- *
- */
- abstract public void stopJenkinsSlave(String name);
-
- /**
- * @return the mesos implementation instance
- */
- public static synchronized Mesos getInstance() {
- if (mesos == null) {
- mesos = new MesosImpl();
- }
- return mesos;
- }
-
- public static class MesosImpl extends Mesos {
- @Override
- public synchronized void startScheduler(String jenkinsMaster, String mesosMaster) {
- stopScheduler();
- scheduler = new JenkinsScheduler(jenkinsMaster, mesosMaster);
- scheduler.init();
- }
-
- @Override
- public synchronized boolean isSchedulerRunning() {
- return scheduler != null && scheduler.isRunning();
- }
-
- @Override
- public synchronized void stopScheduler() {
- if (scheduler != null) {
- scheduler.stop();
- scheduler = null;
- }
- }
-
- @Override
- public synchronized void startJenkinsSlave(SlaveRequest request, SlaveResult result) {
- if (scheduler != null) {
- scheduler.requestJenkinsSlave(request, result);
- }
- }
-
- @Override
- public synchronized void stopJenkinsSlave(String name) {
- if (scheduler != null) {
- scheduler.terminateJenkinsSlave(name);
- }
- }
-
- private JenkinsScheduler scheduler;
- }
-}
http://git-wip-us.apache.org/repos/asf/mesos/blob/e54a7952/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosCloud.java
----------------------------------------------------------------------
diff --git a/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosCloud.java b/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosCloud.java
deleted file mode 100644
index 29dbea5..0000000
--- a/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosCloud.java
+++ /dev/null
@@ -1,215 +0,0 @@
-package org.jenkinsci.plugins.mesos;
-
-import hudson.Extension;
-import hudson.model.Computer;
-import hudson.model.Descriptor;
-import hudson.model.Descriptor.FormException;
-import hudson.model.Hudson;
-import hudson.model.Label;
-import hudson.model.Node;
-import hudson.model.Node.Mode;
-import hudson.slaves.Cloud;
-import hudson.slaves.NodeProperty;
-import hudson.slaves.NodeProvisioner.PlannedNode;
-import hudson.util.FormValidation;
-
-import java.io.IOException;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.Callable;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.servlet.ServletException;
-
-import jenkins.model.Jenkins;
-import net.sf.json.JSONObject;
-
-import org.kohsuke.stapler.DataBoundConstructor;
-import org.kohsuke.stapler.QueryParameter;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
-
-public class MesosCloud extends Cloud {
-
- private String master;
- private String description;
-
- // Find the default values for these variables in
- // src/main/resources/org/jenkinsci/plugins/mesos/MesosCloud/config.jelly.
- private final int slaveCpus;
- private final int slaveMem; // MB.
- private final int executorCpus;
- private final int maxExecutors;
- private final int executorMem; // MB.
- private final int idleTerminationMinutes;
-
- private final String labelString = "mesos";
-
- private static String staticMaster;
-
- private static final Logger LOGGER = Logger.getLogger(MesosCloud.class.getName());
-
- @DataBoundConstructor
- public MesosCloud(String master, String description, int slaveCpus,
- int slaveMem, int maxExecutors, int executorCpus, int executorMem, int idleTerminationMinutes)
- throws NumberFormatException {
- super("MesosCloud");
-
- this.master = master;
- this.description = description;
- this.slaveCpus = slaveCpus;
- this.slaveMem = slaveMem;
- this.maxExecutors = maxExecutors;
- this.executorCpus = executorCpus;
- this.executorMem = executorMem;
- this.idleTerminationMinutes = idleTerminationMinutes;
-
- // Restart the scheduler if the master has changed or a scheduler is not up.
- if (!master.equals(staticMaster) || !Mesos.getInstance().isSchedulerRunning()) {
- if (!master.equals(staticMaster)) {
- LOGGER.info("Mesos master changed, restarting the scheduler");
- } else {
- LOGGER.info("Scheduler was down, restarting the scheduler");
- }
-
- Mesos.getInstance().stopScheduler();
- Mesos.getInstance().startScheduler(Jenkins.getInstance().getRootUrl(), master);
- } else {
- LOGGER.info("Mesos master has not changed, leaving the scheduler running");
- }
-
- staticMaster = master;
- }
-
- @Override
- public Collection<PlannedNode> provision(Label label, int excessWorkload) {
- List<PlannedNode> list = new ArrayList<PlannedNode>();
- try {
- while (excessWorkload > 0) {
- final int numExecutors = Math.min(excessWorkload, maxExecutors);
- excessWorkload -= numExecutors;
- LOGGER.info("Provisioning Jenkins Slave on Mesos with " + numExecutors +
- " executors. Remaining excess workload: " + excessWorkload + " executors)");
- list.add(new PlannedNode(this.getDisplayName(), Computer.threadPoolForRemoting
- .submit(new Callable<Node>() {
- public Node call() throws Exception {
- MesosSlave s = doProvision(numExecutors);
- Hudson.getInstance().addNode(s);
- return s;
- }
- }), numExecutors));
- }
- } catch (Exception e) {
- LOGGER.log(Level.WARNING, "Failed to create instances on Mesos", e);
- return Collections.emptyList();
- }
-
- return list;
- }
-
- private MesosSlave doProvision(int numExecutors) throws Descriptor.FormException, IOException {
- String name = "mesos-jenkins-" + UUID.randomUUID().toString();
- return new MesosSlave(name, numExecutors, labelString, slaveCpus, slaveMem,
- executorCpus, executorMem, idleTerminationMinutes);
- }
-
- @Override
- public boolean canProvision(Label label) {
- // Provisioning is simply creating a task for a jenkins slave.
- // Therefore, we can always provision as long as the label
- // matches "mesos".
- // TODO(vinod): The framework may not have the resources necessary
- // to start a task when it comes time to launch the slave.
- return label.matches(Label.parse(labelString));
- }
-
- public String getMaster() {
- return this.master;
- }
-
- public void setMaster(String master) {
- this.master = master;
- }
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- @Override
- public DescriptorImpl getDescriptor() {
- return (DescriptorImpl) super.getDescriptor();
- }
-
- public static MesosCloud get() {
- return Hudson.getInstance().clouds.get(MesosCloud.class);
- }
-
- @Extension
- public static class DescriptorImpl extends Descriptor<Cloud> {
- private String master;
- private String description;
-
- @Override
- public String getDisplayName() {
- return "Mesos Cloud";
- }
-
- @Override
- public boolean configure(StaplerRequest request, JSONObject object) throws FormException {
- master = object.getString("master");
- description = object.getString("description");
- save();
- return super.configure(request, object);
- }
-
- /**
- * Test connection from configuration page.
- */
- public FormValidation doTestConnection(@QueryParameter String master)
- throws IOException, ServletException {
- master = master.trim();
-
- if (master.equals("local")) {
- return FormValidation.warning("'local' creates a local mesos cluster");
- }
-
- if (master.startsWith("zk://")) {
- return FormValidation.warning("Zookeeper paths can be used, but the connection cannot be " +
- "tested prior to saving this page.");
- }
-
- if (master.startsWith("http://")) {
- return FormValidation.error("Please omit 'http://'.");
- }
-
- try {
- // URL requires the protocol to be explicitly specified.
- HttpURLConnection urlConn =
- (HttpURLConnection) new URL("http://" + master).openConnection();
- urlConn.connect();
- int code = urlConn.getResponseCode();
- urlConn.disconnect();
-
- if (code == 200) {
- return FormValidation.ok("Connected to Mesos successfully");
- } else {
- return FormValidation.error("Status returned from url was " + code);
- }
- } catch (IOException e) {
- LOGGER.log(Level.WARNING, "Failed to connect to Mesos " + master, e);
- return FormValidation.error(e.getMessage());
- }
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/mesos/blob/e54a7952/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosComputer.java
----------------------------------------------------------------------
diff --git a/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosComputer.java b/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosComputer.java
deleted file mode 100644
index 1196b9d..0000000
--- a/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosComputer.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.jenkinsci.plugins.mesos;
-
-import hudson.model.Slave;
-import hudson.slaves.SlaveComputer;
-
-import java.io.IOException;
-
-import org.kohsuke.stapler.HttpRedirect;
-import org.kohsuke.stapler.HttpResponse;
-
-public class MesosComputer extends SlaveComputer {
- public MesosComputer(Slave slave) {
- super(slave);
- }
-
- @Override
- public MesosSlave getNode() {
- return (MesosSlave) super.getNode();
- }
-
- @Override
- public HttpResponse doDoDelete() throws IOException {
- checkPermission(DELETE);
- if (getNode() != null)
- getNode().terminate();
- return new HttpRedirect("..");
- }
-}
http://git-wip-us.apache.org/repos/asf/mesos/blob/e54a7952/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosComputerLauncher.java
----------------------------------------------------------------------
diff --git a/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosComputerLauncher.java b/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosComputerLauncher.java
deleted file mode 100644
index c752254..0000000
--- a/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosComputerLauncher.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package org.jenkinsci.plugins.mesos;
-
-import hudson.model.TaskListener;
-import hudson.slaves.ComputerLauncher;
-import hudson.slaves.SlaveComputer;
-
-import java.io.PrintStream;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.logging.Logger;
-
-import org.jenkinsci.plugins.mesos.Mesos.JenkinsSlave;
-
-public class MesosComputerLauncher extends ComputerLauncher {
-
- enum State { INIT, RUNNING, FAILURE }
-
- private static final Logger LOGGER = Logger.getLogger(MesosComputerLauncher.class.getName());
-
- public MesosComputerLauncher(String _name) {
- super();
- LOGGER.info("Constructing MesosComputerLauncher");
- this.state = State.INIT;
- this.name = _name;
- }
-
- /**
- * Launches a mesos task that starts the jenkins slave.
- *
- * NOTE: This has to be a blocking call:
- *
- * @see hudson.slaves.ComputerLauncher#launch(hudson.slaves.SlaveComputer,
- * hudson.model.TaskListener)
- */
- @Override
- public void launch(SlaveComputer _computer, TaskListener listener) throws InterruptedException {
- LOGGER.info("Launching slave computer " + name);
-
- MesosComputer computer = (MesosComputer) _computer;
- PrintStream logger = listener.getLogger();
-
- // Get a handle to mesos.
- Mesos mesos = Mesos.getInstance();
-
- // If Jenkins scheduler is not running, terminate the node.
- // This might happen if the computer was offline when Jenkins was shutdown.
- // Since Jenkins persists its state, it tries to launch offline slaves when
- // it restarts.
- if (!mesos.isSchedulerRunning()) {
- LOGGER.warning("Not launching " + name +
- " because the Mesos Jenkins scheduler is not running");
- computer.getNode().terminate();
- return;
- }
-
- // Create the request.
- int cpus = computer.getNode().getCpus();
- int mem = computer.getNode().getMem();
- Mesos.SlaveRequest request = new Mesos.SlaveRequest(new JenkinsSlave(name), cpus, mem);
-
- // Launch the jenkins slave.
- final Lock lock = new ReentrantLock();
- final CountDownLatch latch = new CountDownLatch(1);
-
- logger.println("Starting mesos slave " + name);
- LOGGER.info("Sending a request to start jenkins slave " + name);
- mesos.startJenkinsSlave(request, new Mesos.SlaveResult() {
- @Override
- public void running(JenkinsSlave slave) {
- state = State.RUNNING;
- latch.countDown();
- }
-
- @Override
- public void finished(JenkinsSlave slave) {
- state = State.FAILURE;
- latch.countDown();
- }
-
- @Override
- public void failed(JenkinsSlave slave) {
- state = State.FAILURE;
- latch.countDown();
- }
- });
-
- // Block until we know the status of the slave.
- // TODO(vinod): What happens if the callback is called again!
- latch.await();
-
- if (state == State.RUNNING) {
- logger.println("Successfully launched slave" + name);
- }
-
- LOGGER.info("Finished launching slave computer " + name);
- }
-
- /**
- * Kills the mesos task that corresponds to the Jenkins slave, asynchronously.
- */
- public void terminate() {
- // Get a handle to mesos.
- Mesos mesos = Mesos.getInstance();
-
- mesos.stopJenkinsSlave(name);
- }
-
- private volatile State state;
- private final String name;
-}
http://git-wip-us.apache.org/repos/asf/mesos/blob/e54a7952/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosRetentionStrategy.java
----------------------------------------------------------------------
diff --git a/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosRetentionStrategy.java b/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosRetentionStrategy.java
deleted file mode 100644
index b0b6d8a..0000000
--- a/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosRetentionStrategy.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.jenkinsci.plugins.mesos;
-
-import static hudson.util.TimeUnit2.MINUTES;
-
-import java.util.logging.Logger;
-
-import org.kohsuke.stapler.DataBoundConstructor;
-
-import hudson.model.Descriptor;
-import hudson.slaves.RetentionStrategy;
-import hudson.util.TimeUnit2;
-
-/**
- * This is inspired by {@link hudson.slaves.CloudRetentionStrategy}.
- */
-public class MesosRetentionStrategy extends RetentionStrategy<MesosComputer> {
-
- /**
- * Number of minutes of idleness before an instance should be terminated. A
- * value of zero indicates that the instance should never be automatically
- * terminated.
- */
- public final int idleTerminationMinutes;
-
- private static final Logger LOGGER = Logger
- .getLogger(MesosRetentionStrategy.class.getName());
-
- public MesosRetentionStrategy(int idleTerminationMinutes) {
- this.idleTerminationMinutes = idleTerminationMinutes;
- }
-
- @Override
- public synchronized long check(MesosComputer c) {
- if (c.getNode() == null) {
- return 1;
- }
-
- // If we just launched this computer, check back after 1 min.
- // NOTE: 'c.getConnectTime()' refers to when the Jenkins slave was launched.
- if ((System.currentTimeMillis() - c.getConnectTime()) <
- MINUTES.toMillis(idleTerminationMinutes)) {
- return 1;
- }
-
- // If the computer is offline, terminate it.
- if (c.isOffline()) {
- LOGGER.info("Disconnecting offline computer " + c.getName());
- c.getNode().terminate();
- return 1;
- }
-
- // Terminate the computer if it is idle for longer than
- // 'idleTerminationMinutes'.
- if (c.isIdle()) {
- final long idleMilliseconds =
- System.currentTimeMillis() - c.getIdleStartMilliseconds();
-
- if (idleMilliseconds > MINUTES.toMillis(idleTerminationMinutes)) {
- LOGGER.info("Disconnecting idle computer " + c.getName());
- c.getNode().terminate();
- }
- }
- return 1;
- }
-
- /**
- * Try to connect to it ASAP to launch the slave agent.
- */
- @Override
- public void start(MesosComputer c) {
- c.connect(false);
- }
-
- /**
- * No registration since this retention strategy is used only for Mesos nodes
- * that we provision automatically.
- */
- public static class DescriptorImpl extends Descriptor<RetentionStrategy<?>> {
- @Override
- public String getDisplayName() {
- return "MESOS";
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/mesos/blob/e54a7952/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosSlave.java
----------------------------------------------------------------------
diff --git a/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosSlave.java b/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosSlave.java
deleted file mode 100644
index 9848ae9..0000000
--- a/jenkins/src/main/java/org/jenkinsci/plugins/mesos/MesosSlave.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package org.jenkinsci.plugins.mesos;
-
-import hudson.Extension;
-import hudson.model.Computer;
-import hudson.model.Descriptor;
-import hudson.model.Descriptor.FormException;
-import hudson.model.Hudson;
-import hudson.model.Slave;
-import hudson.slaves.NodeProperty;
-import hudson.slaves.ComputerLauncher;
-import hudson.slaves.RetentionStrategy;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.kohsuke.stapler.DataBoundConstructor;
-
-public class MesosSlave extends Slave {
-
- private final int cpus;
- private final int mem;
-
- private static final Logger LOGGER = Logger.getLogger(MesosSlave.class
- .getName());
-
- @DataBoundConstructor
- public MesosSlave(String name, int numExecutors, String labelString,
- int slaveCpus, int slaveMem, int executorCpus, int executorMem,
- int idleTerminationMinutes) throws FormException, IOException
- {
- super(name,
- labelString, // node description.
- "jenkins", // remoteFS.
- "" + numExecutors,
- Mode.NORMAL,
- labelString, // Label.
- new MesosComputerLauncher(name),
- new MesosRetentionStrategy(idleTerminationMinutes),
- Collections.<NodeProperty<?>> emptyList());
-
- this.cpus = slaveCpus + (numExecutors * executorCpus);
- this.mem = slaveMem + (numExecutors * executorMem);
-
- LOGGER.info("Constructing Mesos slave");
- }
-
- public int getCpus() {
- return cpus;
- }
-
- public int getMem() {
- return mem;
- }
-
- public void terminate() {
- LOGGER.info("Terminating slave " + getNodeName());
- try {
- // Remove the node from hudson.
- Hudson.getInstance().removeNode(this);
-
- ComputerLauncher launcher = getLauncher();
-
- // If this is a mesos computer launcher, terminate the launcher.
- if (launcher instanceof MesosComputerLauncher) {
- ((MesosComputerLauncher) launcher).terminate();
- }
- } catch (IOException e) {
- LOGGER.log(Level.WARNING, "Failed to terminate Mesos instance: "
- + getInstanceId(), e);
- }
- }
-
- @Override
- public DescriptorImpl getDescriptor() {
- return (DescriptorImpl) super.getDescriptor();
- }
-
- @Extension
- public static class DescriptorImpl extends SlaveDescriptor {
- @Override
- public String getDisplayName() {
- return "Mesos Slave";
- }
- }
-
- private String getInstanceId() {
- return getNodeName();
- }
-
- public void idleTimeout() {
- LOGGER.info("Mesos instance idle time expired: " + getInstanceId()
- + ", terminate now");
- terminate();
- }
-
- @Override
- public Computer createComputer() {
- return new MesosComputer(this);
- }
-}
http://git-wip-us.apache.org/repos/asf/mesos/blob/e54a7952/jenkins/src/main/resources/index.jelly
----------------------------------------------------------------------
diff --git a/jenkins/src/main/resources/index.jelly b/jenkins/src/main/resources/index.jelly
deleted file mode 100644
index 62343d2..0000000
--- a/jenkins/src/main/resources/index.jelly
+++ /dev/null
@@ -1,7 +0,0 @@
-<!--
- This view is used to render the installed plugins page.
--->
-<div>
- This plugin can be used to connect Jenkins master to a Mesos cluster
- and dynamically launch Jenkins slaves based on the work load.
-</div>
http://git-wip-us.apache.org/repos/asf/mesos/blob/e54a7952/jenkins/src/main/resources/org/jenkinsci/plugins/mesos/MesosCloud/config.jelly
----------------------------------------------------------------------
diff --git a/jenkins/src/main/resources/org/jenkinsci/plugins/mesos/MesosCloud/config.jelly b/jenkins/src/main/resources/org/jenkinsci/plugins/mesos/MesosCloud/config.jelly
deleted file mode 100644
index e12283a..0000000
--- a/jenkins/src/main/resources/org/jenkinsci/plugins/mesos/MesosCloud/config.jelly
+++ /dev/null
@@ -1,38 +0,0 @@
-<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form">
-
- <f:entry title="${%Mesos Master [hostname:port]}" help="help-master.html">
- <f:textbox field="master" />
- </f:entry>
-
- <f:entry title="${%Description}">
- <f:textbox field="description" />
- </f:entry>
-
- <f:advanced>
- <f:entry title="${%Jenkins Slave CPUs}">
- <f:number field="slaveCpus" clazz="required positive-number" value="1"/>
- </f:entry>
-
- <f:entry title="${%Jenkins Slave Memory in MB}">
- <f:number field="slaveMem" clazz="required positive-number" value="512"/>
- </f:entry>
-
- <f:entry title="${% Maximum number of Executors per Slave}">
- <f:number field="maxExecutors" clazz="required number" value="2"/>
- </f:entry>
-
- <f:entry title="${%Jenkins Executor CPUs}">
- <f:number field="executorCpus" clazz="required number" value="1"/>
- </f:entry>
-
- <f:entry title="${%Jenkins Executor Memory in MB}">
- <f:number field="executorMem" clazz="required positive-number" value="128"/>
- </f:entry>
-
- <f:entry title="${%Idle Termination Minutes}">
- <f:number field="idleTerminationMinutes" clazz="required positive-number" value="3"/>
- </f:entry>
- </f:advanced>
-
- <f:validateButton title="${%Test Connection}" progress="${%Testing...}" method="testConnection" with="master"/>
-</j:jelly>
http://git-wip-us.apache.org/repos/asf/mesos/blob/e54a7952/jenkins/src/main/resources/org/jenkinsci/plugins/mesos/MesosCloud/help-master.html
----------------------------------------------------------------------
diff --git a/jenkins/src/main/resources/org/jenkinsci/plugins/mesos/MesosCloud/help-master.html b/jenkins/src/main/resources/org/jenkinsci/plugins/mesos/MesosCloud/help-master.html
deleted file mode 100644
index ecf60cc..0000000
--- a/jenkins/src/main/resources/org/jenkinsci/plugins/mesos/MesosCloud/help-master.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<div>
- Specifies the hostname:port of the Mesos master.
-</div>
http://git-wip-us.apache.org/repos/asf/mesos/blob/e54a7952/jenkins/src/main/resources/org/jenkinsci/plugins/mesos/MesosSlave/configure-entries.jelly
----------------------------------------------------------------------
diff --git a/jenkins/src/main/resources/org/jenkinsci/plugins/mesos/MesosSlave/configure-entries.jelly b/jenkins/src/main/resources/org/jenkinsci/plugins/mesos/MesosSlave/configure-entries.jelly
deleted file mode 100644
index d671731..0000000
--- a/jenkins/src/main/resources/org/jenkinsci/plugins/mesos/MesosSlave/configure-entries.jelly
+++ /dev/null
@@ -1,15 +0,0 @@
-<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form">
-
- <f:entry title="${%# of executors}">
- <f:readOnlyTextbox field="numExecutors" clazz="positive-number"/>
- </f:entry>
-
- <f:entry title="${%Labels}">
- <f:readOnlyTextbox field="labelString"/>
- </f:entry>
-
- <f:entry title="${%Idle Termination Minutes}">
- <f:readOnlyTextbox field="idleTerminationMinutes" clazz="positive-number"/>
- </f:entry>
-
-</j:jelly>