Added basic DiskInfo check in master. Review: https://reviews.apache.org/r/28626
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/34bb637b Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/34bb637b Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/34bb637b Branch: refs/heads/master Commit: 34bb637b2479cede846d8b1140756e06ebc2dafe Parents: 7ac99a5 Author: Jie Yu <[email protected]> Authored: Tue Dec 2 17:26:14 2014 -0800 Committer: Jie Yu <[email protected]> Committed: Wed Dec 3 16:12:07 2014 -0800 ---------------------------------------------------------------------- src/master/master.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/34bb637b/src/master/master.cpp ---------------------------------------------------------------------- diff --git a/src/master/master.cpp b/src/master/master.cpp index c3465a6..bf9d20f 100644 --- a/src/master/master.cpp +++ b/src/master/master.cpp @@ -1904,17 +1904,76 @@ struct ResourceChecker : TaskInfoVisitor return Error("Task uses invalid resources: " + error.get().message); } + // Ensure any DiskInfos in the task are valid according to the + // currently supported semantics. + foreach (const Resource& resource, task.resources()) { + if (resource.has_disk()) { + error = validateDiskInfo(resource); + if (error.isSome()) { + return Error("Task uses invalid DiskInfo: " + error.get().message); + } + } + } + if (task.has_executor()) { Option<Error> error = Resources::validate(task.executor().resources()); if (error.isSome()) { return Error( - "Executor for task " + stringify(task.task_id()) + - " uses invalid resources: " + error.get().message); + "Executor uses invalid resources: " + error.get().message); + } + + // Ensure any DiskInfos in the executor are valid according to + // the currently supported semantics. + foreach (const Resource& resource, task.executor().resources()) { + if (resource.has_disk()) { + error = validateDiskInfo(resource); + if (error.isSome()) { + return Error( + "Executor uses invalid DiskInfo: " + error.get().message); + } + } } } return None(); } + + Option<Error> validateDiskInfo(const Resource& resource) + { + CHECK(resource.has_disk()); + + if (resource.disk().has_persistence()) { + if (resource.role() == "*") { + return Error("Persistent disk volume is disallowed for '*' role"); + } + if (!resource.disk().has_volume()) { + return Error("Persistent disk should specify a volume"); + } + if (resource.disk().volume().mode() == Volume::RO) { + return Error("Read-only volume is not supported for DiskInfo"); + } + if (resource.disk().volume().has_host_path()) { + return Error("Volume in DiskInfo should not have 'host_path' set"); + } + + // Ensure persistence ID does not have invalid characters. + string id = resource.disk().persistence().id(); + if (std::count_if(id.begin(), id.end(), invalid) > 0) { + return Error("Persistence ID '" + id + "' contains invalid characters"); + } + } else { + if (resource.disk().has_volume()) { + return Error("Non-persistent disk volume is not supported"); + } + } + + return None(); + } + + static bool invalid(char c) + { + return iscntrl(c) || c == '/' || c == '\\'; + } };
