| // Copyright 2020 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. |
| |
| #ifndef LIBBRILLO_BRILLO_BLKDEV_UTILS_LVM_DEVICE_H_ |
| #define LIBBRILLO_BRILLO_BLKDEV_UTILS_LVM_DEVICE_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include <base/files/file_path.h> |
| #include <brillo/brillo_export.h> |
| |
| namespace brillo { |
| // LvmCommandRunner acts as an abstract interface to run LVM2 commands. |
| class BRILLO_EXPORT LvmCommandRunner { |
| public: |
| LvmCommandRunner(); |
| virtual ~LvmCommandRunner(); |
| |
| // Run the command using liblvm2cmd: the command looks the same as what |
| // would be run on the command line but saves the step of creating and |
| // launching an extra process. |
| virtual bool RunCommand(const std::vector<std::string>& cmd); |
| // thin-provisioning tools are not packaged as a part of lvm2cmd. Use a |
| // process runner instead. Additionally, instead of overloading the |
| // lvm2_log_fn to access the output of a command, we prefer to use a process. |
| virtual bool RunProcess(const std::vector<std::string>& cmd, |
| std::string* output = nullptr); |
| |
| private: |
| void* lvm_handle_ = nullptr; |
| }; |
| |
| // LVM objects are short-lived objects that represent the state of the system |
| // at the time of query: it is expected that users will create a new PV/VG/LV |
| // object, use it to perform housekeeping operations and then destroy the object |
| // instead of persistent storage for these objects. |
| class BRILLO_EXPORT PhysicalVolume { |
| public: |
| PhysicalVolume(const base::FilePath& device_path, |
| std::shared_ptr<LvmCommandRunner> lvm); |
| ~PhysicalVolume() = default; |
| |
| bool Check(); |
| bool Repair(); |
| bool Remove(); |
| base::FilePath GetPath() const { return device_path_; } |
| bool IsValid() { return device_path_ != base::FilePath(); } |
| |
| private: |
| base::FilePath device_path_; |
| std::shared_ptr<LvmCommandRunner> lvm_; |
| }; |
| |
| class BRILLO_EXPORT VolumeGroup { |
| public: |
| VolumeGroup(const std::string& volume_group_name, |
| std::shared_ptr<LvmCommandRunner> lvm); |
| ~VolumeGroup() = default; |
| bool Activate(); |
| bool Check(); |
| bool Repair(); |
| bool Deactivate(); |
| bool Remove(); |
| std::string GetName() const { return volume_group_name_; } |
| bool IsValid() { return !volume_group_name_.empty(); } |
| base::FilePath GetPath() const; |
| |
| private: |
| std::string volume_group_name_; |
| std::shared_ptr<LvmCommandRunner> lvm_; |
| }; |
| |
| class BRILLO_EXPORT Thinpool { |
| public: |
| Thinpool(const std::string& thinpool_name, |
| const std::string& volume_group_name, |
| std::shared_ptr<LvmCommandRunner> lvm_); |
| ~Thinpool() = default; |
| bool Activate(); |
| bool Check(); |
| bool Repair(); |
| bool Deactivate(); |
| std::string GetName() const { |
| return thinpool_name_.empty() ? "" |
| : volume_group_name_ + "/" + thinpool_name_; |
| } |
| bool IsValid() { return !thinpool_name_.empty(); } |
| bool Remove(); |
| |
| private: |
| std::string thinpool_name_; |
| std::string volume_group_name_; |
| std::shared_ptr<LvmCommandRunner> lvm_; |
| }; |
| |
| class BRILLO_EXPORT LogicalVolume { |
| public: |
| LogicalVolume(const std::string& logical_volume_name, |
| const std::string& volume_group_name, |
| std::shared_ptr<LvmCommandRunner> lvm); |
| ~LogicalVolume() = default; |
| bool Activate(); |
| bool Deactivate(); |
| bool Remove(); |
| bool IsValid() { return !logical_volume_name_.empty(); } |
| base::FilePath GetPath(); |
| std::string GetName() const { |
| return logical_volume_name_.empty() |
| ? "" |
| : volume_group_name_ + "/" + logical_volume_name_; |
| } |
| |
| private: |
| std::string logical_volume_name_; |
| std::string volume_group_name_; |
| std::shared_ptr<LvmCommandRunner> lvm_; |
| }; |
| |
| } // namespace brillo |
| |
| #endif // LIBBRILLO_BRILLO_BLKDEV_UTILS_LVM_DEVICE_H_ |