Class: Pvectl::Repositories::Volume
- Defined in:
- lib/pvectl/repositories/volume.rb
Overview
Repository for virtual disk volumes attached to VMs and containers.
Aggregates volume data from two sources:
-
VM/CT config endpoints (parsed disk keys from configuration)
-
Storage content API (+/nodes/node/storage/storage/content+)
Uses composition: delegates to VmRepository and ContainerRepository for config fetching and node resolution.
Constant Summary collapse
- VM_DISK_PATTERN =
Pattern matching VM disk keys (scsi0, virtio1, ide2, sata3, efidisk0, tpmstate0)
/\A(?:scsi|virtio|ide|sata|efidisk|tpmstate)\d+\z/- CT_DISK_PATTERN =
Pattern matching container disk keys (rootfs, mp0, mp1, …)
/\A(?:rootfs|mp\d+)\z/
Instance Method Summary collapse
-
#find(resource_type:, id:, disk_name:, node: nil) ⇒ Models::Volume?
Finds a specific volume by disk name in a VM/CT config.
-
#initialize(connection, vm_repo: nil, container_repo: nil) ⇒ Volume
constructor
Creates a new Volume repository.
-
#list_from_config(resource_type:, ids:, node: nil) ⇒ Array<Models::Volume>
Lists volumes from VM/CT configuration for given resource IDs.
-
#list_from_storage(storage:, node: nil) ⇒ Array<Models::Volume>
Lists volumes from storage content API.
Methods inherited from Base
Constructor Details
#initialize(connection, vm_repo: nil, container_repo: nil) ⇒ Volume
Creates a new Volume repository.
39 40 41 42 43 |
# File 'lib/pvectl/repositories/volume.rb', line 39 def initialize(connection, vm_repo: nil, container_repo: nil) super(connection) @vm_repo = vm_repo @container_repo = container_repo end |
Instance Method Details
#find(resource_type:, id:, disk_name:, node: nil) ⇒ Models::Volume?
Finds a specific volume by disk name in a VM/CT config.
91 92 93 94 |
# File 'lib/pvectl/repositories/volume.rb', line 91 def find(resource_type:, id:, disk_name:, node: nil) volumes = list_from_config(resource_type: resource_type, ids: [id], node: node) volumes.find { |v| v.name == disk_name } end |
#list_from_config(resource_type:, ids:, node: nil) ⇒ Array<Models::Volume>
Lists volumes from VM/CT configuration for given resource IDs.
Fetches config from each VM/CT and extracts disk entries. Excludes CD-ROM entries (containing media=cdrom).
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/pvectl/repositories/volume.rb', line 54 def list_from_config(resource_type:, ids:, node: nil) type = normalize_resource_type(resource_type) repo = repo_for(type) return [] unless repo volumes = ids.flat_map do |id| resource = repo.get(id) next [] if resource.nil? next [] if node && resource.node != node config = repo.fetch_config(resource.node, id.to_i) extract_volumes(config, type, id.to_i, resource.node) end volumes end |
#list_from_storage(storage:, node: nil) ⇒ Array<Models::Volume>
Lists volumes from storage content API.
Queries /nodes/{node}/storage/{storage}/content to list all volumes in the given storage.
79 80 81 82 |
# File 'lib/pvectl/repositories/volume.rb', line 79 def list_from_storage(storage:, node: nil) nodes = node ? [node] : online_nodes nodes.flat_map { |node_name| fetch_storage_volumes(node_name, storage) } end |