Option<Error> validate(const mesos::executor::Call& call) { if (!call.IsInitialized()) { return Error("Not initialized: " + call.InitializationErrorString()); } if (!call.has_type()) { return Error("Expecting 'type' to be present"); } // All calls should have executor id set. if (!call.has_executor_id()) { return Error("Expecting 'executor_id' to be present"); } // All calls should have framework id set. if (!call.has_framework_id()) { return Error("Expecting 'framework_id' to be present"); } switch (call.type()) { case mesos::executor::Call::SUBSCRIBE: { if (!call.has_subscribe()) { return Error("Expecting 'subscribe' to be present"); } return None(); } case mesos::executor::Call::UPDATE: { if (!call.has_update()) { return Error("Expecting 'update' to be present"); } const TaskStatus& status = call.update().status(); if (!status.has_uuid()) { return Error("Expecting 'uuid' to be present"); } Try<UUID> uuid = UUID::fromBytes(status.uuid()); if (uuid.isError()) { return uuid.error(); } if (status.has_executor_id() && status.executor_id().value() != call.executor_id().value()) { return Error("ExecutorID in Call: " + call.executor_id().value() + " does not match ExecutorID in TaskStatus: " + call.update().status().executor_id().value() ); } if (status.source() != TaskStatus::SOURCE_EXECUTOR) { return Error("Received Call from executor " + call.executor_id().value() + " of framework " + call.framework_id().value() + " with invalid source, expecting 'SOURCE_EXECUTOR'" ); } if (status.state() == TASK_STAGING) { return Error("Received TASK_STAGING from executor " + call.executor_id().value() + " of framework " + call.framework_id().value() + " which is not allowed" ); } // TODO(alexr): Validate `check_status` is present if // the corresponding `TaskInfo.check` has been defined. if (status.has_check_status()) { Option<Error> validate = checks::validation::checkStatusInfo(status.check_status()); if (validate.isSome()) { return validate.get(); } } return None(); } case mesos::executor::Call::MESSAGE: { if (!call.has_message()) { return Error("Expecting 'message' to be present"); } return None(); } case mesos::executor::Call::UNKNOWN: { return None(); } } UNREACHABLE(); }
Option<Error> validate(const mesos::executor::Call& call) { if (!call.IsInitialized()) { return Error("Not initialized: " + call.InitializationErrorString()); } if (!call.has_type()) { return Error("Expecting 'type' to be present"); } // All calls should have executor id set. if (!call.has_executor_id()) { return Error("Expecting 'executor_id' to be present"); } // All calls should have framework id set. if (!call.has_framework_id()) { return Error("Expecting 'framework_id' to be present"); } switch (call.type()) { case mesos::executor::Call::SUBSCRIBE: { if (!call.has_subscribe()) { return Error("Expecting 'subscribe' to be present"); } return None(); } case mesos::executor::Call::UPDATE: { if (!call.has_update()) { return Error("Expecting 'update' to be present"); } const TaskStatus& status = call.update().status(); if (!status.has_uuid()) { return Error("Expecting 'uuid' to be present"); } if (status.has_executor_id() && status.executor_id().value() != call.executor_id().value()) { return Error("ExecutorID in Call: " + call.executor_id().value() + " does not match ExecutorID in TaskStatus: " + call.update().status().executor_id().value() ); } if (status.source() != TaskStatus::SOURCE_EXECUTOR) { return Error("Received Call from executor " + call.executor_id().value() + " of framework " + call.framework_id().value() + " with invalid source, expecting 'SOURCE_EXECUTOR'" ); } if (status.state() == TASK_STAGING) { return Error("Received TASK_STAGING from executor " + call.executor_id().value() + " of framework " + call.framework_id().value() + " which is not allowed" ); } return None(); } case mesos::executor::Call::MESSAGE: { if (!call.has_message()) { return Error("Expecting 'message' to be present"); } return None(); } default: { return Error("Unknown call type"); } } }