You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by nn...@apache.org on 2014/11/19 01:35:35 UTC
[1/6] mesos git commit: Added task labels to mesos.proto.
Repository: mesos
Updated Branches:
refs/heads/master 68c66b496 -> 047df2867
Added task labels to mesos.proto.
Review: https://reviews.apache.org/r/28154
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/77b9d3de
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/77b9d3de
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/77b9d3de
Branch: refs/heads/master
Commit: 77b9d3de108ee8399dee8eaf3240572395a26ccd
Parents: 68c66b4
Author: Niklas Nielsen <ni...@qni.dk>
Authored: Tue Nov 18 16:21:24 2014 -0800
Committer: Niklas Q. Nielsen <ni...@mesosphere.io>
Committed: Tue Nov 18 16:21:24 2014 -0800
----------------------------------------------------------------------
include/mesos/mesos.proto | 11 +++++++++++
1 file changed, 11 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/77b9d3de/include/mesos/mesos.proto
----------------------------------------------------------------------
diff --git a/include/mesos/mesos.proto b/include/mesos/mesos.proto
index 35b9118..a123170 100644
--- a/include/mesos/mesos.proto
+++ b/include/mesos/mesos.proto
@@ -596,6 +596,9 @@ message TaskInfo {
// A health check for the task (currently in *alpha* and initial
// support will only be for TaskInfo's that have a CommandInfo).
optional HealthCheck health_check = 8;
+ // Labels are free-form key value pairs which are exposed
+ // through master and slave endpoints.
+ repeated Label labels = 10;
}
@@ -927,3 +930,11 @@ message ContainerInfo {
optional DockerInfo docker = 3;
}
+
+/**
+ * Key, value pair used to store free form user-data.
+ */
+message Label {
+ required string key = 1;
+ optional string value = 2;
+}
[6/6] mesos git commit: Added label to ModelTask test.
Posted by nn...@apache.org.
Added label to ModelTask test.
ModelTask needed to be updated to parse new labels field.
Review: https://reviews.apache.org/r/28188
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/047df286
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/047df286
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/047df286
Branch: refs/heads/master
Commit: 047df2867dbc1760017cc4e4dfd08737af3f34e5
Parents: f2e8c0c
Author: Niklas Nielsen <ni...@qni.dk>
Authored: Tue Nov 18 16:22:47 2014 -0800
Committer: Niklas Q. Nielsen <ni...@mesosphere.io>
Committed: Tue Nov 18 16:22:48 2014 -0800
----------------------------------------------------------------------
src/tests/common/http_tests.cpp | 1 +
1 file changed, 1 insertion(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/047df286/src/tests/common/http_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/common/http_tests.cpp b/src/tests/common/http_tests.cpp
index 912653b..f087b23 100644
--- a/src/tests/common/http_tests.cpp
+++ b/src/tests/common/http_tests.cpp
@@ -85,6 +85,7 @@ TEST(HTTP, ModelTask)
" \"executor_id\":\"\","
" \"framework_id\":\"f\","
" \"id\":\"t\","
+ " \"labels\": [],"
" \"name\":\"task\","
" \"resources\":"
" {"
[5/6] mesos git commit: Wired up task labels in slave.
Posted by nn...@apache.org.
Wired up task labels in slave.
Review: https://reviews.apache.org/r/28158
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/f2e8c0cb
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/f2e8c0cb
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/f2e8c0cb
Branch: refs/heads/master
Commit: f2e8c0cbfa5950f9a980001c6545828b12c06acf
Parents: 7d9c1ac
Author: Niklas Nielsen <ni...@qni.dk>
Authored: Tue Nov 18 16:22:33 2014 -0800
Committer: Niklas Q. Nielsen <ni...@mesosphere.io>
Committed: Tue Nov 18 16:22:33 2014 -0800
----------------------------------------------------------------------
src/common/protobuf_utils.cpp | 2 +
src/tests/slave_tests.cpp | 134 +++++++++++++++++++++++++++++++++++++
2 files changed, 136 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/f2e8c0cb/src/common/protobuf_utils.cpp
----------------------------------------------------------------------
diff --git a/src/common/protobuf_utils.cpp b/src/common/protobuf_utils.cpp
index e3e430d..baf04a6 100644
--- a/src/common/protobuf_utils.cpp
+++ b/src/common/protobuf_utils.cpp
@@ -103,6 +103,8 @@ Task createTask(
t.mutable_executor_id()->CopyFrom(task.executor().executor_id());
}
+ t.mutable_labels()->MergeFrom(task.labels());
+
return t;
}
http://git-wip-us.apache.org/repos/asf/mesos/blob/f2e8c0cb/src/tests/slave_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/slave_tests.cpp b/src/tests/slave_tests.cpp
index 18ff8fe..4675dac 100644
--- a/src/tests/slave_tests.cpp
+++ b/src/tests/slave_tests.cpp
@@ -1389,3 +1389,137 @@ TEST_F(SlaveTest, ReregisterWithStatusUpdateTaskState)
Shutdown();
}
+
+
+// This test verifies that label values can be set for tasks and that
+// they are exposed over the slave state endpoint.
+TEST_F(SlaveTest, TaskLabels)
+{
+ Try<PID<Master>> master = StartMaster();
+ ASSERT_SOME(master);
+
+ MockExecutor exec(DEFAULT_EXECUTOR_ID);
+
+ TestContainerizer containerizer(&exec);
+
+ Try<PID<Slave>> slave = StartSlave(&containerizer);
+ ASSERT_SOME(slave);
+
+ MockScheduler sched;
+ MesosSchedulerDriver driver(
+ &sched, DEFAULT_FRAMEWORK_INFO, master.get(), DEFAULT_CREDENTIAL);
+
+ EXPECT_CALL(sched, registered(&driver, _, _))
+ .Times(1);
+
+ Future<vector<Offer>> offers;
+ EXPECT_CALL(sched, resourceOffers(&driver, _))
+ .WillOnce(FutureArg<1>(&offers))
+ .WillRepeatedly(Return()); // Ignore subsequent offers.
+
+ driver.start();
+
+ AWAIT_READY(offers);
+ EXPECT_NE(0u, offers.get().size());
+
+ TaskInfo task;
+ task.set_name("");
+ task.mutable_task_id()->set_value("1");
+ task.mutable_slave_id()->MergeFrom(offers.get()[0].slave_id());
+ task.mutable_resources()->MergeFrom(offers.get()[0].resources());
+ task.mutable_executor()->MergeFrom(DEFAULT_EXECUTOR_INFO);
+
+ // Add three labels to the task (two of which share the same key).
+ Label* label1 = task.add_labels();
+ label1->set_key("foo");
+ label1->set_value("bar");
+
+ Label* label2 = task.add_labels();
+ label2->set_key("bar");
+ label2->set_value("baz");
+
+ Label* label3 = task.add_labels();
+ label3->set_key("bar");
+ label3->set_value("qux");
+
+ vector<TaskInfo> tasks;
+ tasks.push_back(task);
+
+ EXPECT_CALL(exec, registered(_, _, _, _))
+ .Times(1);
+
+ EXPECT_CALL(exec, launchTask(_, _))
+ .WillOnce(SendStatusUpdateFromTask(TASK_RUNNING));
+
+ Future<Nothing> update;
+ EXPECT_CALL(containerizer,
+ update(_, Resources(offers.get()[0].resources())))
+ .WillOnce(DoAll(FutureSatisfy(&update),
+ Return(Future<Nothing>())));
+
+ Future<TaskStatus> status;
+ EXPECT_CALL(sched, statusUpdate(&driver, _))
+ .WillOnce(FutureArg<1>(&status));
+
+ driver.launchTasks(offers.get()[0].id(), tasks);
+
+ AWAIT_READY(status);
+ EXPECT_EQ(TASK_RUNNING, status.get().state());
+
+ AWAIT_READY(update);
+
+ // Verify label key and value in slave state.json.
+ Future<process::http::Response> response =
+ process::http::get(slave.get(), "state.json");
+ AWAIT_READY(response);
+
+ EXPECT_SOME_EQ(
+ "application/json",
+ response.get().headers.get("Content-Type"));
+
+ Try<JSON::Object> parse = JSON::parse<JSON::Object>(response.get().body);
+ ASSERT_SOME(parse);
+
+ Result<JSON::Array> labelsObject = parse.get().find<JSON::Array>(
+ "frameworks[0].executors[0].tasks[0].labels");
+ EXPECT_SOME(labelsObject);
+
+ JSON::Array labelsObject_ = labelsObject.get();
+
+ // Verify the content of 'foo:bar' pair.
+ JSON::Object labelObject1 = labelsObject_.values[0].as<JSON::Object>();
+
+ const JSON::String key1 = labelObject1.values["key"].as<JSON::String>();
+ const JSON::String value1 = labelObject1.values["value"].as<JSON::String>();
+
+ EXPECT_EQ(key1.value, "foo");
+ EXPECT_EQ(value1.value, "bar");
+
+
+ // Verify the content of 'bar:baz' pair.
+ JSON::Object labelObject2 = labelsObject_.values[1].as<JSON::Object>();
+
+ const JSON::String key2 = labelObject2.values["key"].as<JSON::String>();
+ const JSON::String value2 = labelObject2.values["value"].as<JSON::String>();
+
+ EXPECT_EQ(key2.value, "bar");
+ EXPECT_EQ(value2.value, "baz");
+
+
+ // Verify the content of 'bar:qux' pair.
+ JSON::Object labelObject3 = labelsObject_.values[2].as<JSON::Object>();
+
+ const JSON::String key3 = labelObject3.values["key"].as<JSON::String>();
+ const JSON::String value3 = labelObject3.values["value"].as<JSON::String>();
+
+ EXPECT_EQ(key3.value, "bar");
+ EXPECT_EQ(value3.value, "qux");
+
+ EXPECT_CALL(exec, shutdown(_))
+ .Times(AtMost(1));
+
+ driver.stop();
+ driver.join();
+
+ Shutdown(); // Must shutdown before 'containerizer' gets deallocated.
+}
[2/6] mesos git commit: Added task labels modeling to http helpers.
Posted by nn...@apache.org.
Added task labels modeling to http helpers.
Review: https://reviews.apache.org/r/28155
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/8ed19187
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/8ed19187
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/8ed19187
Branch: refs/heads/master
Commit: 8ed19187ca9389a580aefe24eeedce188f3ace68
Parents: 77b9d3d
Author: Niklas Nielsen <ni...@qni.dk>
Authored: Tue Nov 18 16:21:40 2014 -0800
Committer: Niklas Q. Nielsen <ni...@mesosphere.io>
Committed: Tue Nov 18 16:21:40 2014 -0800
----------------------------------------------------------------------
src/common/http.cpp | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/8ed19187/src/common/http.cpp
----------------------------------------------------------------------
diff --git a/src/common/http.cpp b/src/common/http.cpp
index 58050e9..b21e18d 100644
--- a/src/common/http.cpp
+++ b/src/common/http.cpp
@@ -130,6 +130,15 @@ JSON::Object model(const Task& task)
}
object.values["statuses"] = array;
+ JSON::Array labels;
+ foreach (const Label& label, task.labels()) {
+ JSON::Object labelObject;
+ labelObject.values["key"] = label.key();
+ labelObject.values["value"] = label.has_value() ? label.value() : "";
+ labels.values.push_back(labelObject);
+ }
+ object.values["labels"] = labels;
+
return object;
}
@@ -162,6 +171,15 @@ JSON::Object model(
}
object.values["statuses"] = array;
+ JSON::Array labels;
+ foreach (const Label& label, task.labels()) {
+ JSON::Object labelObject;
+ labelObject.values["key"] = label.key();
+ labelObject.values["value"] = label.has_value() ? label.value() : "";
+ labels.values.push_back(labelObject);
+ }
+ object.values["labels"] = labels;
+
return object;
}
[4/6] mesos git commit: Wired up task labels in master.
Posted by nn...@apache.org.
Wired up task labels in master.
Review: https://reviews.apache.org/r/28157
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/7d9c1ac5
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/7d9c1ac5
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/7d9c1ac5
Branch: refs/heads/master
Commit: 7d9c1ac5e5f936de0a83b77766e92b813c9b9919
Parents: 56fa2c1
Author: Niklas Nielsen <ni...@qni.dk>
Authored: Tue Nov 18 16:22:16 2014 -0800
Committer: Niklas Q. Nielsen <ni...@mesosphere.io>
Committed: Tue Nov 18 16:22:16 2014 -0800
----------------------------------------------------------------------
src/master/master.cpp | 2 +
src/tests/master_tests.cpp | 135 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 137 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/7d9c1ac5/src/master/master.cpp
----------------------------------------------------------------------
diff --git a/src/master/master.cpp b/src/master/master.cpp
index b5fa8d1..9e2d768 100644
--- a/src/master/master.cpp
+++ b/src/master/master.cpp
@@ -2515,6 +2515,8 @@ Resources Master::launchTask(
t->mutable_executor_id()->MergeFrom(executorId.get());
}
+ t->mutable_labels()->MergeFrom(task.labels());
+
slave->addTask(t);
framework->addTask(t);
http://git-wip-us.apache.org/repos/asf/mesos/blob/7d9c1ac5/src/tests/master_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/master_tests.cpp b/src/tests/master_tests.cpp
index 66423a9..b629cf7 100644
--- a/src/tests/master_tests.cpp
+++ b/src/tests/master_tests.cpp
@@ -2539,3 +2539,138 @@ TEST_F(MasterTest, FrameworkWebUIUrl)
Shutdown();
}
+
+
+// This test verifies that label values are exposed over the master
+// state endpoint.
+TEST_F(MasterTest, TaskLabels)
+{
+ Try<PID<Master>> master = StartMaster();
+ ASSERT_SOME(master);
+
+ MockExecutor exec(DEFAULT_EXECUTOR_ID);
+
+ TestContainerizer containerizer(&exec);
+
+ Try<PID<Slave>> slave = StartSlave(&containerizer);
+ ASSERT_SOME(slave);
+
+ MockScheduler sched;
+ MesosSchedulerDriver driver(
+ &sched, DEFAULT_FRAMEWORK_INFO, master.get(), DEFAULT_CREDENTIAL);
+
+ EXPECT_CALL(sched, registered(&driver, _, _))
+ .Times(1);
+
+ Future<vector<Offer>> offers;
+ EXPECT_CALL(sched, resourceOffers(&driver, _))
+ .WillOnce(FutureArg<1>(&offers))
+ .WillRepeatedly(Return()); // Ignore subsequent offers.
+
+ driver.start();
+
+ AWAIT_READY(offers);
+ EXPECT_NE(0u, offers.get().size());
+
+ TaskInfo task;
+ task.set_name("");
+ task.mutable_task_id()->set_value("1");
+ task.mutable_slave_id()->MergeFrom(offers.get()[0].slave_id());
+ task.mutable_resources()->MergeFrom(offers.get()[0].resources());
+ task.mutable_executor()->MergeFrom(DEFAULT_EXECUTOR_INFO);
+
+ // Add three labels to the task (two of which share the same key).
+ Label* label1 = task.add_labels();
+ label1->set_key("foo");
+ label1->set_value("bar");
+
+ Label* label2 = task.add_labels();
+ label2->set_key("bar");
+ label2->set_value("baz");
+
+ Label* label3 = task.add_labels();
+ label3->set_key("bar");
+ label3->set_value("qux");
+
+ vector<TaskInfo> tasks;
+ tasks.push_back(task);
+
+ EXPECT_CALL(exec, registered(_, _, _, _))
+ .Times(1);
+
+ EXPECT_CALL(exec, launchTask(_, _))
+ .WillOnce(SendStatusUpdateFromTask(TASK_RUNNING));
+
+ Future<Nothing> update;
+ EXPECT_CALL(containerizer,
+ update(_, Resources(offers.get()[0].resources())))
+ .WillOnce(DoAll(FutureSatisfy(&update),
+ Return(Future<Nothing>())));
+
+ Future<TaskStatus> status;
+ EXPECT_CALL(sched, statusUpdate(&driver, _))
+ .WillOnce(FutureArg<1>(&status));
+
+ driver.launchTasks(offers.get()[0].id(), tasks);
+
+ AWAIT_READY(status);
+ EXPECT_EQ(TASK_RUNNING, status.get().state());
+
+ AWAIT_READY(update);
+
+ // Verify label key and value in master state.json.
+ Future<process::http::Response> response =
+ process::http::get(master.get(), "state.json");
+ AWAIT_READY(response);
+
+ EXPECT_SOME_EQ(
+ "application/json",
+ response.get().headers.get("Content-Type"));
+
+ Try<JSON::Object> parse = JSON::parse<JSON::Object>(response.get().body);
+ ASSERT_SOME(parse);
+
+ Result<JSON::Array> labelsObject = parse.get().find<JSON::Array>(
+ "frameworks[0].tasks[0].labels");
+ EXPECT_SOME(labelsObject);
+
+ JSON::Array labelsObject_ = labelsObject.get();
+
+ // Verify the content of 'foo:bar' pair.
+ JSON::Object labelObject1 = labelsObject_.values[0].as<JSON::Object>();
+
+ const JSON::String key1 = labelObject1.values["key"].as<JSON::String>();
+ const JSON::String value1 = labelObject1.values["value"].as<JSON::String>();
+
+ EXPECT_EQ(key1.value, "foo");
+ EXPECT_EQ(value1.value, "bar");
+
+
+ // Verify the content of 'bar:baz' pair.
+ JSON::Object labelObject2 = labelsObject_.values[1].as<JSON::Object>();
+
+ const JSON::String key2 = labelObject2.values["key"].as<JSON::String>();
+ const JSON::String value2 = labelObject2.values["value"].as<JSON::String>();
+
+ EXPECT_EQ(key2.value, "bar");
+ EXPECT_EQ(value2.value, "baz");
+
+
+ // Verify the content of 'bar:qux' pair.
+ JSON::Object labelObject3 = labelsObject_.values[2].as<JSON::Object>();
+
+ const JSON::String key3 = labelObject3.values["key"].as<JSON::String>();
+ const JSON::String value3 = labelObject3.values["value"].as<JSON::String>();
+
+ EXPECT_EQ(key3.value, "bar");
+ EXPECT_EQ(value3.value, "qux");
+
+
+ EXPECT_CALL(exec, shutdown(_))
+ .Times(AtMost(1));
+
+ driver.stop();
+ driver.join();
+
+ Shutdown(); // Must shutdown before 'containerizer' gets deallocated.
+}
[3/6] mesos git commit: Added task labels to internal task message.
Posted by nn...@apache.org.
Added task labels to internal task message.
Review: https://reviews.apache.org/r/28156
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/56fa2c16
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/56fa2c16
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/56fa2c16
Branch: refs/heads/master
Commit: 56fa2c16c4acdb87713c42d4115fe2803bd86660
Parents: 8ed1918
Author: Niklas Nielsen <ni...@qni.dk>
Authored: Tue Nov 18 16:21:58 2014 -0800
Committer: Niklas Q. Nielsen <ni...@mesosphere.io>
Committed: Tue Nov 18 16:21:58 2014 -0800
----------------------------------------------------------------------
src/messages/messages.proto | 2 ++
1 file changed, 2 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/56fa2c16/src/messages/messages.proto
----------------------------------------------------------------------
diff --git a/src/messages/messages.proto b/src/messages/messages.proto
index 566ce53..28e593f 100644
--- a/src/messages/messages.proto
+++ b/src/messages/messages.proto
@@ -53,6 +53,8 @@ message Task {
// NOTE: Either both the fields must be set or both must be unset.
optional TaskState status_update_state = 9;
optional bytes status_update_uuid = 10;
+
+ repeated Label labels = 11;
}