blob: 1e123fac21ab98c508ca96112e080bd7d48389cb [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef __FILES_HPP__
#define __FILES_HPP__
#include <string>
#include <mesos/authorizer/authorizer.hpp>
#include <process/future.hpp>
#include <process/http.hpp>
#include <stout/format.hpp>
#include <stout/json.hpp>
#include <stout/nothing.hpp>
#include <stout/path.hpp>
#include "common/protobuf_utils.hpp"
#include "mesos/mesos.hpp"
namespace mesos {
namespace internal {
// Forward declarations.
class FilesProcess;
// Represents the various errors that can be returned by methods on the `Files`
// class via a `Try` that has failed.
class FilesError : public Error
{
public:
enum Type
{
INVALID, // Invalid argument.
NOT_FOUND, // Not found.
UNAUTHORIZED, // Not authorized to perform the operation.
UNKNOWN // Internal error/all other errors.
};
FilesError(Type _type)
: Error(stringify(_type)), type(_type) {}
FilesError(Type _type, const std::string& _message)
: Error(stringify(_type)), type(_type), message(_message) {}
Type type;
std::string message;
};
// Provides an abstraction for browsing and reading files via HTTP
// endpoints. A path (file or directory) may be "attached" to a name
// (similar to "mounting" a device) for subsequent browsing and
// reading of any files and directories it contains. The "mounting" of
// paths to names enables us to do a form of chrooting for better
// security and isolation of files.
class Files
{
public:
Files(const Option<std::string>& authenticationRealm = None(),
const Option<mesos::Authorizer*>& authorizer = None());
~Files();
// Returns the result of trying to attach the specified path
// (directory or file) at the specified name.
process::Future<Nothing> attach(
const std::string& path,
const std::string& name,
const Option<lambda::function<process::Future<bool>(
const Option<process::http::authentication::Principal>&)>>&
authorized = None());
// Removes the specified name.
void detach(const std::string& name);
// Returns a file listing for a directory similar to `ls -l`.
process::Future<Try<std::list<FileInfo>, FilesError>> browse(
const std::string& path,
const Option<process::http::authentication::Principal>& principal);
// Returns the size and data of file.
process::Future<Try<std::tuple<size_t, std::string>, FilesError>> read(
const size_t offset,
const Option<size_t>& length,
const std::string& path,
const Option<process::http::authentication::Principal>& principal);
private:
FilesProcess* process;
};
} // namespace internal {
} // namespace mesos {
#endif // __FILES_HPP__