Skip to content

Commit 5ca82f5

Browse files
committed
apply mesos#538
1 parent 9de3529 commit 5ca82f5

File tree

7 files changed

+75
-4
lines changed

7 files changed

+75
-4
lines changed

docs/docs/api.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ Here is a more elaborate example of a dependent job hash:
180180
## Adding a Docker Job
181181

182182
A docker job takes the same format as a scheduled job or a dependency job and runs on a Docker container.
183-
To configure it, an additional `container` argument is required, which contains a type (required), an image (required), a network mode (optional), mounted volumes (optional) and whether Mesos should always pull the latest image before executing or not (optional).
183+
To configure it, an additional `container` argument is required, which contains a type (required), an image (required), a network mode (optional), mounted volumes (optional), parameters (optional) and whether Mesos should always pull the latest image before executing or not (optional).
184184

185185
* Endpoint: __/scheduler/iso8601__ or __/scheduler/dependency__
186186
* Method: __POST__
@@ -229,6 +229,20 @@ Chronos by adding the `forcePullImage` boolean to your `container` configuration
229229
Chronos will default to not doing a `docker pull` if the image is already found on the executing node. The alternative approach is to use versions/tags for
230230
your images.
231231

232+
There is also support for passing in arbitrary docker config options.
233+
234+
```json
235+
{
236+
"container": {
237+
"type": "DOCKER",
238+
"image": "libmesos/ubuntu",
239+
"parameters": [
240+
{ "key": "a-docker-option", "value": "xxx" },
241+
{ "key": "b-docker-option", "value": "yyy" }
242+
]
243+
}
244+
```
245+
232246
## Updating Task Progress
233247

234248
Task progress can be updated by providing the number of additional elements processed. This will increment the existing count of elements processed.

src/main/scala/org/apache/mesos/chronos/scheduler/jobs/Containers.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,6 @@ case class Volume(
2727
case class DockerContainer(
2828
@JsonProperty image: String,
2929
@JsonProperty volumes: Seq[Volume],
30+
@JsonProperty parameters: Seq[Parameter],
3031
@JsonProperty network: NetworkMode = NetworkMode.HOST,
3132
@JsonProperty forcePullImage: Boolean = false)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.apache.mesos.chronos.scheduler.jobs
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty
4+
5+
import org.apache.mesos.{ Protos => mesos }
6+
7+
/**
8+
* Represents an environment variable definition for the job
9+
*/
10+
case class Parameter(
11+
key: String,
12+
value: String) {
13+
14+
def toProto(): mesos.Parameter =
15+
mesos.Parameter.newBuilder
16+
.setKey(key)
17+
.setValue(value)
18+
.build
19+
}
20+
object Parameter {
21+
def apply(proto: mesos.Parameter): Parameter =
22+
Parameter(
23+
proto.getKey,
24+
proto.getValue
25+
)
26+
}

src/main/scala/org/apache/mesos/chronos/scheduler/mesos/MesosTaskBuilder.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ class MesosTaskBuilder @Inject()(val conf: SchedulerConfiguration) {
170170
.setImage(job.container.image)
171171
.setNetwork(DockerInfo.Network.valueOf(job.container.network.toString.toUpperCase))
172172
.setForcePullImage(job.container.forcePullImage)
173+
.addAllParameters(job.container.parameters.map(_.toProto).asJava)
173174
.build()).build
174175
}
175176

src/main/scala/org/apache/mesos/chronos/utils/JobDeserializer.scala

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,18 @@ class JobDeserializer extends JsonDeserializer[BaseJob] {
171171
if (containerNode.has("forcePullImage") && containerNode.get("forcePullImage") != null)
172172
Try(containerNode.get("forcePullImage").asText.toBoolean).getOrElse(false)
173173
else false
174-
container = DockerContainer(containerNode.get("image").asText, volumes, networkMode, forcePullImage)
174+
175+
176+
var parameters = scala.collection.mutable.ListBuffer[Parameter]()
177+
if (containerNode.has("parameters")) {
178+
containerNode.get("parameters").elements().map {
179+
case node: ObjectNode =>
180+
Parameter(node.get("key").asText(), node.get("value").asText)
181+
}.foreach(parameters.add)
182+
}
183+
184+
185+
container = DockerContainer(containerNode.get("image").asText, volumes, parameters, networkMode, forcePullImage)
175186
}
176187

177188
val constraints = scala.collection.mutable.ListBuffer[Constraint]()

src/main/scala/org/apache/mesos/chronos/utils/JobSerializer.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,19 @@ class JobSerializer extends JsonSerializer[BaseJob] {
136136
json.writeEndArray()
137137
json.writeFieldName("forcePullImage")
138138
json.writeBoolean(baseJob.container.forcePullImage)
139+
140+
json.writeFieldName("parameters")
141+
json.writeStartArray()
142+
baseJob.container.parameters.foreach { v =>
143+
json.writeStartObject()
144+
json.writeFieldName("key")
145+
json.writeString(v.key)
146+
json.writeFieldName("value")
147+
json.writeString(v.value)
148+
json.writeEndObject()
149+
}
150+
json.writeEndArray()
151+
139152
json.writeEndObject()
140153
}
141154

src/test/scala/org/apache/mesos/chronos/scheduler/api/SerDeTest.scala

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ class SerDeTest extends SpecificationWithJUnit {
2929
)
3030

3131
val forcePullImage = false
32-
val container = DockerContainer("dockerImage", volumes, NetworkMode.BRIDGE, forcePullImage)
32+
33+
var parameters = scala.collection.mutable.ListBuffer[Parameter]()
34+
35+
val container = DockerContainer("dockerImage", volumes, parameters, NetworkMode.BRIDGE, forcePullImage)
3336

3437
val arguments = Seq(
3538
"-testOne"
@@ -69,7 +72,9 @@ class SerDeTest extends SpecificationWithJUnit {
6972
)
7073

7174
val forcePullImage = true
72-
val container = DockerContainer("dockerImage", volumes, NetworkMode.HOST, forcePullImage)
75+
var parameters = scala.collection.mutable.ListBuffer[Parameter]()
76+
77+
val container = DockerContainer("dockerImage", volumes, parameters, NetworkMode.HOST, forcePullImage)
7378

7479
val arguments = Seq(
7580
"-testOne"

0 commit comments

Comments
 (0)