blob: 29098715ce2cde6eb8aba278761f7d7e602d85bd [file] [log] [blame]
// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "diagnostics/cros_healthd/fetchers/disk_fetcher.h"
#include <utility>
#include <vector>
#include <base/optional.h>
#include <brillo/udev/udev.h>
#include "diagnostics/common/status_macros.h"
#include "diagnostics/common/statusor.h"
#include "diagnostics/cros_healthd/fetchers/storage/device_lister.h"
#include "diagnostics/cros_healthd/fetchers/storage/device_manager.h"
#include "diagnostics/cros_healthd/fetchers/storage/device_resolver.h"
#include "diagnostics/cros_healthd/utils/error_utils.h"
namespace diagnostics {
namespace {
namespace mojo_ipc = ::chromeos::cros_healthd::mojom;
mojo_ipc::ErrorType StatusCodeToMojoError(StatusCode code) {
switch (code) {
case StatusCode::kUnavailable:
return mojo_ipc::ErrorType::kFileReadError;
case StatusCode::kInvalidArgument:
return mojo_ipc::ErrorType::kParseError;
case StatusCode::kInternal:
return mojo_ipc::ErrorType::kSystemUtilityError;
default:
NOTREACHED() << "Unexpected error code: " << static_cast<int>(code);
return mojo_ipc::ErrorType::kSystemUtilityError;
}
}
mojo_ipc::NonRemovableBlockDeviceResultPtr StatusToProbeError(
const Status& status) {
return mojo_ipc::NonRemovableBlockDeviceResult::NewError(
CreateAndLogProbeError(StatusCodeToMojoError(status.code()),
status.message()));
}
} // namespace
Status DiskFetcher::InitManager(const base::FilePath& root) {
auto udev = brillo::Udev::Create();
if (!udev)
return Status(StatusCode::kInternal, "Unable to create udev interface");
auto platform = std::make_unique<Platform>();
ASSIGN_OR_RETURN(auto resolver, StorageDeviceResolver::Create(
root, platform->GetRootDeviceName()));
manager_.reset(new StorageDeviceManager(
std::make_unique<StorageDeviceLister>(), std::move(resolver),
std::move(udev), std::move(platform)));
return Status::OkStatus();
}
mojo_ipc::NonRemovableBlockDeviceResultPtr
DiskFetcher::FetchNonRemovableBlockDevicesInfo(const base::FilePath& root) {
if (!manager_) {
auto status = InitManager(root);
if (!status.ok())
return StatusToProbeError(status);
}
StatusOr<std::vector<
chromeos::cros_healthd::mojom::NonRemovableBlockDeviceInfoPtr>>
devices_or = manager_->FetchDevicesInfo(root);
if (devices_or.ok()) {
return mojo_ipc::NonRemovableBlockDeviceResult::NewBlockDeviceInfo(
std::move(devices_or.value()));
}
return StatusToProbeError(devices_or.status());
}
} // namespace diagnostics