Class: Pvectl::Models::Storage

Inherits:
Base
  • Object
show all
Defined in:
lib/pvectl/models/storage.rb

Overview

Represents a storage pool in the Proxmox cluster.

Immutable domain model containing storage attributes and predicate methods. Created by Repositories::Storage from API data. Display formatting is handled by Presenters::Storage.

Examples:

Creating a Storage model

storage = Storage.new(name: "local", plugintype: "dir", status: "available")
storage.active? #=> true
storage.shared? #=> false

From API response

data = { "storage" => "local", "plugintype" => "dir", "status" => "available" }
storage = Storage.new(data)

See Also:

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(attrs = {}) ⇒ Storage

Creates a new Storage model from attributes.

Handles field aliasing between different API endpoints:

  • /cluster/resources uses: disk, maxdisk

  • /nodes/#node/storage uses: used, total, avail

Parameters:

  • attrs (Hash) (defaults to: {})

    Storage attributes from API (string or symbol keys)



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/pvectl/models/storage.rb', line 96

def initialize(attrs = {})
  super(attrs)
  @name = @attributes[:name] || @attributes[:storage]
  @plugintype = @attributes[:plugintype] || @attributes[:type]
  @node = @attributes[:node]
  @content = @attributes[:content]
  @shared = @attributes[:shared] || 0

  # Handle field aliasing between endpoints
  # /cluster/resources uses: disk, maxdisk
  # /nodes/{node}/storage uses: used, total, avail
  @disk = @attributes[:disk] || @attributes[:used]
  @maxdisk = @attributes[:maxdisk] || @attributes[:total]
  @avail = @attributes[:avail]
  @enabled = @attributes[:enabled]
  @active_flag = @attributes[:active]

  # Status normalization: /nodes/{node}/storage has no status field
  # Derive from active flag if status not present
  @status = @attributes[:status] || derive_status_from_active

  # Configuration fields from /storage/{storage} API endpoint
  @path = @attributes[:path]
  @server = @attributes[:server]
  @export = @attributes[:export]
  @pool = @attributes[:pool]
  @vgname = @attributes[:vgname]
  @thinpool = @attributes[:thinpool]
  @nodes_allowed = @attributes[:nodes]  # API returns "nodes" not "nodes_allowed"
  @prune_backups = @attributes[:"prune-backups"]  # API uses hyphen
  @max_files = @attributes[:maxfiles]
  @volumes = @attributes[:volumes] || []
end

Instance Attribute Details

#active_flagInteger? (readonly)

Returns active flag (0/1) (from /nodes/#node/storage).

Returns:

  • (Integer, nil)

    active flag (0/1) (from /nodes/#node/storage)



55
56
57
# File 'lib/pvectl/models/storage.rb', line 55

def active_flag
  @active_flag
end

#availInteger? (readonly)

Returns available bytes (from /nodes/#node/storage).

Returns:

  • (Integer, nil)

    available bytes (from /nodes/#node/storage)



49
50
51
# File 'lib/pvectl/models/storage.rb', line 49

def avail
  @avail
end

#contentString? (readonly)

Returns comma-separated content types (images, iso, vztmpl, backup, rootdir).

Returns:

  • (String, nil)

    comma-separated content types (images, iso, vztmpl, backup, rootdir)



43
44
45
# File 'lib/pvectl/models/storage.rb', line 43

def content
  @content
end

#diskInteger? (readonly)

Returns disk used in bytes.

Returns:

  • (Integer, nil)

    disk used in bytes



37
38
39
# File 'lib/pvectl/models/storage.rb', line 37

def disk
  @disk
end

#enabledInteger? (readonly)

Returns enabled flag (0/1) (from /nodes/#node/storage).

Returns:

  • (Integer, nil)

    enabled flag (0/1) (from /nodes/#node/storage)



52
53
54
# File 'lib/pvectl/models/storage.rb', line 52

def enabled
  @enabled
end

#exportString? (readonly)

Returns export path (nfs).

Returns:

  • (String, nil)

    export path (nfs)



65
66
67
# File 'lib/pvectl/models/storage.rb', line 65

def export
  @export
end

#max_filesInteger? (readonly)

Returns max backups (deprecated).

Returns:

  • (Integer, nil)

    max backups (deprecated)



83
84
85
# File 'lib/pvectl/models/storage.rb', line 83

def max_files
  @max_files
end

#maxdiskInteger? (readonly)

Returns total disk in bytes.

Returns:

  • (Integer, nil)

    total disk in bytes



40
41
42
# File 'lib/pvectl/models/storage.rb', line 40

def maxdisk
  @maxdisk
end

#nameString (readonly)

Returns storage pool name.

Returns:

  • (String)

    storage pool name



25
26
27
# File 'lib/pvectl/models/storage.rb', line 25

def name
  @name
end

#nodeString? (readonly)

Returns node name (nil for shared storage).

Returns:

  • (String, nil)

    node name (nil for shared storage)



34
35
36
# File 'lib/pvectl/models/storage.rb', line 34

def node
  @node
end

#nodes_allowedString? (readonly)

Returns allowed nodes (nil = all).

Returns:

  • (String, nil)

    allowed nodes (nil = all)



77
78
79
# File 'lib/pvectl/models/storage.rb', line 77

def nodes_allowed
  @nodes_allowed
end

#pathString? (readonly)

Configuration fields (from /storage/storage API endpoint)

Returns:

  • (String, nil)

    path for dir, nfs storage types



59
60
61
# File 'lib/pvectl/models/storage.rb', line 59

def path
  @path
end

#plugintypeString (readonly)

Returns storage plugin type (dir, lvmthin, rbd, nfs, zfspool, etc.).

Returns:

  • (String)

    storage plugin type (dir, lvmthin, rbd, nfs, zfspool, etc.)



28
29
30
# File 'lib/pvectl/models/storage.rb', line 28

def plugintype
  @plugintype
end

#poolString? (readonly)

Returns pool name (zfs, ceph).

Returns:

  • (String, nil)

    pool name (zfs, ceph)



68
69
70
# File 'lib/pvectl/models/storage.rb', line 68

def pool
  @pool
end

#prune_backupsHash? (readonly)

Returns retention policy hash.

Returns:

  • (Hash, nil)

    retention policy hash



80
81
82
# File 'lib/pvectl/models/storage.rb', line 80

def prune_backups
  @prune_backups
end

#serverString? (readonly)

Returns server for nfs, iscsi, ceph.

Returns:

  • (String, nil)

    server for nfs, iscsi, ceph



62
63
64
# File 'lib/pvectl/models/storage.rb', line 62

def server
  @server
end

#sharedInteger (readonly)

Returns shared flag (1 = shared, 0 = local).

Returns:

  • (Integer)

    shared flag (1 = shared, 0 = local)



46
47
48
# File 'lib/pvectl/models/storage.rb', line 46

def shared
  @shared
end

#statusString (readonly)

Returns storage status (available, unavailable).

Returns:

  • (String)

    storage status (available, unavailable)



31
32
33
# File 'lib/pvectl/models/storage.rb', line 31

def status
  @status
end

#thinpoolString? (readonly)

Returns thin pool name (lvmthin).

Returns:

  • (String, nil)

    thin pool name (lvmthin)



74
75
76
# File 'lib/pvectl/models/storage.rb', line 74

def thinpool
  @thinpool
end

#vgnameString? (readonly)

Returns volume group (lvm).

Returns:

  • (String, nil)

    volume group (lvm)



71
72
73
# File 'lib/pvectl/models/storage.rb', line 71

def vgname
  @vgname
end

#volumesArray<Hash> (readonly)

Content summary

Returns:

  • (Array<Hash>)

    volumes from /content endpoint



87
88
89
# File 'lib/pvectl/models/storage.rb', line 87

def volumes
  @volumes
end

Instance Method Details

#active?Boolean

Checks if the storage is active/available.

Returns:

  • (Boolean)

    true if status is “available” or “active”



133
134
135
# File 'lib/pvectl/models/storage.rb', line 133

def active?
  status == "available" || status == "active"
end

#enabled?Boolean

Checks if the storage is enabled.

Returns:

  • (Boolean)

    true if enabled flag is 1



156
157
158
# File 'lib/pvectl/models/storage.rb', line 156

def enabled?
  enabled == 1
end

#shared?Boolean

Checks if the storage is shared across nodes.

Returns:

  • (Boolean)

    true if shared flag is 1



163
164
165
# File 'lib/pvectl/models/storage.rb', line 163

def shared?
  shared == 1
end

#totalInteger?

Returns total bytes (alias for maxdisk). Provides semantic clarity when working with /nodes/#node/storage API.

Returns:

  • (Integer, nil)

    total bytes



149
150
151
# File 'lib/pvectl/models/storage.rb', line 149

def total
  maxdisk
end

#usedInteger?

Returns used bytes (alias for disk). Provides semantic clarity when working with /nodes/#node/storage API.

Returns:

  • (Integer, nil)

    bytes used



141
142
143
# File 'lib/pvectl/models/storage.rb', line 141

def used
  disk
end