Try<Owned<HealthChecker>> HealthChecker::create( const HealthCheck& check, const UPID& executor, const TaskID& taskID) { // Validate the 'HealthCheck' protobuf. if (check.has_http() && check.has_command()) { return Error("Both 'http' and 'command' health check requested"); } if (!check.has_http() && !check.has_command()) { return Error("Expecting one of 'http' or 'command' health check"); } Owned<HealthCheckerProcess> process(new HealthCheckerProcess( check, executor, taskID)); return Owned<HealthChecker>(new HealthChecker(process)); }
Option<Error> healthCheck(const HealthCheck& check) { if (!check.has_type()) { return Error("HealthCheck must specify 'type'"); } switch (check.type()) { case HealthCheck::COMMAND: { if (!check.has_command()) { return Error("Expecting 'command' to be set for command health check"); } const CommandInfo& command = check.command(); if (!command.has_value()) { string commandType = (command.shell() ? "'shell command'" : "'executable path'"); return Error("Command health check must contain " + commandType); } break; } case HealthCheck::HTTP: { if (!check.has_http()) { return Error("Expecting 'http' to be set for HTTP health check"); } const HealthCheck::HTTPCheckInfo& http = check.http(); if (http.has_scheme() && http.scheme() != "http" && http.scheme() != "https") { return Error( "Unsupported HTTP health check scheme: '" + http.scheme() + "'"); } if (http.has_path() && !strings::startsWith(http.path(), '/')) { return Error( "The path '" + http.path() + "' of HTTP health check must start with '/'"); } break; } case HealthCheck::TCP: { if (!check.has_tcp()) { return Error("Expecting 'tcp' to be set for TCP health check"); } break; } case HealthCheck::UNKNOWN: { return Error( "'" + HealthCheck::Type_Name(check.type()) + "'" " is not a valid health check type"); } } return None(); }