本文整理汇总了C++中process::Failure方法的典型用法代码示例。如果您正苦于以下问题:C++ process::Failure方法的具体用法?C++ process::Failure怎么用?C++ process::Failure使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类process
的用法示例。
在下文中一共展示了process::Failure方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: handleHttpBadResponse
Future<http::Response> RegistryClientProcess::doHttpGet(
const http::URL& url,
const Option<http::Headers>& headers,
bool isStreaming,
bool resend,
const Option<string>& lastResponseStatus) const
{
Future<http::Response> response;
if (isStreaming) {
response = process::http::streaming::get(url, headers);
} else {
response = process::http::get(url, headers);
}
return response
.then(defer(self(), [=](const http::Response& httpResponse)
-> Future<http::Response> {
VLOG(1) << "Response status for url '" << url << "': "
<< httpResponse.status;
// Set the future if we get a OK response.
if (httpResponse.status == "200 OK") {
return httpResponse;
}
if (httpResponse.status == "400 Bad Request") {
return handleHttpBadResponse(httpResponse, isStreaming)
.then([](const string& errorResponse) -> Future<http::Response> {
return Failure(errorResponse);
});
}
// Prevent infinite recursion.
if (lastResponseStatus.isSome() &&
(lastResponseStatus.get() == httpResponse.status)) {
return Failure("Invalid response: " + httpResponse.status);
}
// If resend is not set, we dont try again and stop here.
if (!resend) {
return Failure("Bad response: " + httpResponse.status);
}
// Handle 401 Unauthorized.
if (httpResponse.status == "401 Unauthorized") {
return handleHttpUnauthResponse(
httpResponse,
url,
isStreaming);
}
// Handle redirect.
if (httpResponse.status == "307 Temporary Redirect") {
return handleHttpRedirect(httpResponse, headers, isStreaming);
}
return Failure("Invalid response: " + httpResponse.status);
}));
}
示例2: Failure
Future<Nothing> NvidiaGpuIsolatorProcess::_update(
const ContainerID& containerId,
const set<Gpu>& allocation)
{
if (!infos.contains(containerId)) {
return Failure("Failed to complete GPU allocation: unknown container");
}
Info* info = CHECK_NOTNULL(infos.at(containerId));
foreach (const Gpu& gpu, allocation) {
cgroups::devices::Entry entry;
entry.selector.type = Entry::Selector::Type::CHARACTER;
entry.selector.major = gpu.major;
entry.selector.minor = gpu.minor;
entry.access.read = true;
entry.access.write = true;
entry.access.mknod = true;
Try<Nothing> allow = cgroups::devices::allow(
hierarchy, info->cgroup, entry);
if (allow.isError()) {
return Failure("Failed to grant cgroups access to GPU device"
" '" + stringify(entry) + "': " + allow.error());
}
}
示例3: Failure
// Wait for a subprocess and test the status code for the following
// conditions of 'expected_status':
// 1. 'None' = Anything but '0'.
// 2. 'Some' = the value of 'expected_status'.
// Returns Nothing if the resulting status code matches the
// expectation otherwise a Failure with the output of the subprocess.
// TODO(jmlvanre): Turn this into a generally useful abstraction for
// gtest where we can have a more straigtforward 'expected_status'.
Future<Nothing> await_subprocess(
const Subprocess& subprocess,
const Option<int>& expected_status = None())
{
// Dup the pipe fd of the subprocess so we can read the output if
// needed.
int out = dup(subprocess.out().get());
// Once we get the status of the process.
return subprocess.status()
.then([=](const Option<int>& status) -> Future<Nothing> {
// If the status is not set, fail out.
if (status.isNone()) {
return Failure("Subprocess status is none");
}
// If the status is not what we expect then fail out with the
// output of the subprocess. The failure message will include
// the assertion failures of the subprocess.
if ((expected_status.isSome() && status.get() != expected_status.get()) ||
(expected_status.isNone() && status.get() == 0)) {
return io::read(out)
.then([](const string& output) -> Future<Nothing> {
return Failure("\n[++++++++++] Subprocess output.\n" + output +
"[++++++++++]\n");
});
}
// If the subprocess ran successfully then return nothing.
return Nothing();
}).onAny([=]() {
os::close(out);
});
}
示例4: Failure
Future<Nothing> HealthCheckerProcess::__tcpHealthCheck(
const tuple<
Future<Option<int>>,
Future<string>,
Future<string>>& t)
{
Future<Option<int>> status = std::get<0>(t);
if (!status.isReady()) {
return Failure(
"Failed to get the exit status of the " + string(TCP_CHECK_COMMAND) +
" process: " + (status.isFailed() ? status.failure() : "discarded"));
}
if (status->isNone()) {
return Failure(
"Failed to reap the " + string(TCP_CHECK_COMMAND) + " process");
}
int statusCode = status->get();
if (statusCode != 0) {
Future<string> error = std::get<2>(t);
if (!error.isReady()) {
return Failure(
string(TCP_CHECK_COMMAND) + " returned " +
WSTRINGIFY(statusCode) + "; reading stderr failed: " +
(error.isFailed() ? error.failure() : "discarded"));
}
return Failure(
string(TCP_CHECK_COMMAND) + " returned " +
WSTRINGIFY(statusCode) + ": " + error.get());
}
return Nothing();
}
示例5: Failure
Future<bool> ProvisionerProcess::_destroy(
const ContainerID& containerId,
const list<Future<bool>>& destroys)
{
CHECK(infos.contains(containerId));
CHECK(infos[containerId]->destroying);
vector<string> errors;
foreach (const Future<bool>& future, destroys) {
if (!future.isReady()) {
errors.push_back(future.isFailed()
? future.failure()
: "discarded");
}
}
if (!errors.empty()) {
++metrics.remove_container_errors;
return Failure(
"Failed to destory nested containers: " +
strings::join("; ", errors));
}
const Owned<Info>& info = infos[containerId];
list<Future<bool>> futures;
foreachkey (const string& backend, info->rootfses) {
if (!backends.contains(backend)) {
return Failure("Unknown backend '" + backend + "'");
}
foreach (const string& rootfsId, info->rootfses[backend]) {
string rootfs = provisioner::paths::getContainerRootfsDir(
rootDir,
containerId,
backend,
rootfsId);
string backendDir = provisioner::paths::getBackendDir(
rootDir,
containerId,
backend);
LOG(INFO) << "Destroying container rootfs at '" << rootfs
<< "' for container " << containerId;
futures.push_back(
backends.get(backend).get()->destroy(rootfs, backendDir));
}
}
// TODO(xujyan): Revisit the usefulness of this return value.
return collect(futures)
.then(defer(self(), &ProvisionerProcess::__destroy, containerId));
}
示例6: Failure
Future<Nothing> NetworkCniIsolatorProcess::_detach(
const ContainerID& containerId,
const std::string& networkName,
const string& plugin,
const tuple<Future<Option<int>>, Future<string>>& t)
{
CHECK(infos.contains(containerId));
CHECK(infos[containerId]->containerNetworks.contains(networkName));
Future<Option<int>> status = std::get<0>(t);
if (!status.isReady()) {
return Failure(
"Failed to get the exit status of the CNI plugin '" +
plugin + "' subprocess: " +
(status.isFailed() ? status.failure() : "discarded"));
}
if (status->isNone()) {
return Failure(
"Failed to reap the CNI plugin '" + plugin + "' subprocess");
}
if (status.get() == 0) {
const string ifDir = paths::getInterfaceDir(
rootDir.get(),
containerId.value(),
networkName,
infos[containerId]->containerNetworks[networkName].ifName);
Try<Nothing> rmdir = os::rmdir(ifDir);
if (rmdir.isError()) {
return Failure(
"Failed to remove interface directory '" +
ifDir + "': " + rmdir.error());
}
return Nothing();
}
// CNI plugin will print result (in case of success) or error (in
// case of failure) to stdout.
Future<string> output = std::get<1>(t);
if (!output.isReady()) {
return Failure(
"Failed to read stdout from the CNI plugin '" +
plugin + "' subprocess: " +
(output.isFailed() ? output.failure() : "discarded"));
}
return Failure(
"The CNI plugin '" + plugin + "' failed to detach container "
"from network '" + networkName + "': " + output.get());
}
示例7: Failure
Future<Option<ContainerLaunchInfo>> CgroupsNetClsIsolatorProcess::prepare(
const ContainerID& containerId,
const ContainerConfig& containerConfig)
{
if (infos.contains(containerId)) {
return Failure("Container has already been prepared");
}
// Use this info to create the cgroup, but do not insert it into
// infos till the cgroup has been created successfully.
Info info(path::join(flags.cgroups_root, containerId.value()));
// Create a cgroup for this container.
Try<bool> exists = cgroups::exists(hierarchy, info.cgroup);
if (exists.isError()) {
return Failure("Failed to check if the cgroup already exists: " +
exists.error());
} else if (exists.get()) {
return Failure("The cgroup already exists");
}
Try<Nothing> create = cgroups::create(hierarchy, info.cgroup);
if (create.isError()) {
return Failure("Failed to create the cgroup: " + create.error());
}
// 'chown' the cgroup so the executor can create nested cgroups. Do
// not recurse so the control files are still owned by the slave
// user and thus cannot be changed by the executor.
if (containerConfig.has_user()) {
Try<Nothing> chown = os::chown(
containerConfig.user(),
path::join(hierarchy, info.cgroup),
false);
if (chown.isError()) {
return Failure("Failed to change ownership of cgroup hierarchy: " +
chown.error());
}
}
infos.emplace(containerId, info);
return update(containerId, containerConfig.executorinfo().resources())
.then([]() -> Future<Option<ContainerLaunchInfo>> {
return None();
});
}
示例8: Failure
Future<bool> RegistrarProcess::apply(Owned<Operation> operation)
{
if (recovered.isNone()) {
return Failure("Attempted to apply the operation before recovering");
}
return recovered.get()->future()
.then(defer(self(), &Self::_apply, operation));
}
示例9: Failure
Future<Nothing> Fetcher::fetch(
const URI& uri,
const string& directory) const
{
if (!plugins.contains(uri.scheme())) {
return Failure("Scheme '" + uri.scheme() + "' is not supported");
}
return plugins.at(uri.scheme())->fetch(uri, directory);
}
示例10: Failure
Future<vector<string>> StoreProcess::fetchDependencies(
const string& imageId,
bool cached)
{
const string imagePath = paths::getImagePath(rootDir, imageId);
Try<spec::ImageManifest> manifest = spec::getManifest(imagePath);
if (manifest.isError()) {
return Failure(
"Failed to get dependencies for image id '" + imageId +
"': " + manifest.error());
}
vector<Image::Appc> dependencies;
foreach (const spec::ImageManifest::Dependency& dependency,
manifest->dependencies()) {
Image::Appc appc;
appc.set_name(dependency.imagename());
if (dependency.has_imageid()) {
appc.set_id(dependency.imageid());
}
// TODO(jojy): Make Image::Appc use appc::spec::Label instead of
// mesos::Label so that we can avoid this loop here.
foreach (const spec::ImageManifest::Label& label, dependency.labels()) {
mesos::Label appcLabel;
appcLabel.set_key(label.name());
appcLabel.set_value(label.value());
appc.mutable_labels()->add_labels()->CopyFrom(appcLabel);
}
dependencies.emplace_back(appc);
}
if (dependencies.size() == 0) {
return vector<string>();
}
// Do a depth first search.
vector<Future<vector<string>>> futures;
futures.reserve(dependencies.size());
foreach (const Image::Appc& appc, dependencies) {
futures.emplace_back(fetchImage(appc, cached));
}
示例11: Failure
// In this hook, we check for the presence of a label, and if set
// we return a failure, effectively failing the container creation.
// Otherwise we add an environment variable to the executor and task.
// Additionally, this hook creates a file named "foo" in the container
// work directory (sandbox).
Future<Option<DockerTaskExecutorPrepareInfo>>
slavePreLaunchDockerTaskExecutorDecorator(
const Option<TaskInfo>& taskInfo,
const ExecutorInfo& executorInfo,
const string& containerName,
const string& containerWorkDirectory,
const string& mappedSandboxDirectory,
const Option<map<string, string>>& env) override
{
LOG(INFO) << "Executing 'slavePreLaunchDockerTaskExecutorDecorator' hook";
if (taskInfo.isSome()) {
foreach (const Label& label, taskInfo->labels().labels()) {
if (label.key() == testErrorLabelKey) {
return Failure("Spotted error label");
}
}
}
示例12: Nothing
Future<Nothing> MetadataManagerProcess::recover()
{
string storedImagesPath = paths::getStoredImagesPath(flags.docker_store_dir);
if (!os::exists(storedImagesPath)) {
LOG(INFO) << "No images to load from disk. Docker provisioner image "
<< "storage path '" << storedImagesPath << "' does not exist";
return Nothing();
}
Result<Images> images = state::read<Images>(storedImagesPath);
if (images.isError()) {
return Failure("Failed to read images from '" + storedImagesPath + "' " +
images.error());
}
if (images.isNone()) {
// This could happen if the slave died after opening the file for
// writing but before persisted on disk.
LOG(WARNING) << "The images file '" << storedImagesPath << "' is empty";
return Nothing();
}
foreach (const Image& image, images->images()) {
const string imageReference = stringify(image.reference());
if (storedImages.contains(imageReference)) {
LOG(WARNING) << "Found duplicate image in recovery for image reference '"
<< imageReference << "'";
} else {
storedImages[imageReference] = image;
}
VLOG(1) << "Successfully loaded image '" << imageReference << "'";
}
LOG(INFO) << "Successfully loaded " << storedImages.size()
<< " Docker images";
return Nothing();
}
示例13: manifestURL
Future<Manifest> RegistryClientProcess::getManifest(
const Image::Name& imageName)
{
http::URL manifestURL(registryServer_);
manifestURL.path =
"v2/" + imageName.repository() + "/manifests/" + imageName.tag();
return doHttpGet(manifestURL, None(), false, true, None())
.then(defer(self(), [this] (
const http::Response& response) -> Future<Manifest> {
// TODO(jojy): We dont use the digest that is returned in header.
// This is a good place to validate the manifest.
Try<Manifest> manifest = Manifest::create(response.body);
if (manifest.isError()) {
return Failure(
"Failed to parse manifest response: " + manifest.error());
}
return manifest.get();
}));
}
示例14: Failure
Future<vector<string>> RegistryPullerProcess::__pull(
const spec::ImageReference& reference,
const string& directory,
const spec::v2::ImageManifest& manifest,
const hashset<string>& blobSums)
{
vector<string> layerIds;
list<Future<Nothing>> futures;
for (int i = 0; i < manifest.fslayers_size(); i++) {
CHECK(manifest.history(i).has_v1());
const spec::v1::ImageManifest& v1 = manifest.history(i).v1();
const string& blobSum = manifest.fslayers(i).blobsum();
// NOTE: We put parent layer ids in front because that's what the
// provisioner backends assume.
layerIds.insert(layerIds.begin(), v1.id());
// Skip if the layer is already in the store.
if (os::exists(paths::getImageLayerPath(storeDir, v1.id()))) {
continue;
}
const string layerPath = path::join(directory, v1.id());
const string tar = path::join(directory, blobSum);
const string rootfs = paths::getImageLayerRootfsPath(layerPath);
const string json = paths::getImageLayerManifestPath(layerPath);
VLOG(1) << "Extracting layer tar ball '" << tar
<< " to rootfs '" << rootfs << "'";
// NOTE: This will create 'layerPath' as well.
Try<Nothing> mkdir = os::mkdir(rootfs, true);
if (mkdir.isError()) {
return Failure(
"Failed to create rootfs directory '" + rootfs + "' "
"for layer '" + v1.id() + "': " + mkdir.error());
}
Try<Nothing> write = os::write(json, stringify(JSON::protobuf(v1)));
if (write.isError()) {
return Failure(
"Failed to save the layer manifest for layer '" +
v1.id() + "': " + write.error());
}
futures.push_back(command::untar(Path(tar), Path(rootfs)));
}
return collect(futures)
.then([=]() -> Future<vector<string>> {
// Remove the tarballs after the extraction.
foreach (const string& blobSum, blobSums) {
const string tar = path::join(directory, blobSum);
Try<Nothing> rm = os::rm(tar);
if (rm.isError()) {
return Failure(
"Failed to remove '" + tar + "' "
"after extraction: " + rm.error());
}
}
return layerIds;
});
示例15: Failure
Future<double> fail()
{
return Failure("failure");
}