Module: ForemanFogProxmox::ProxmoxVMQueries

Includes:
ProxmoxPools, ProxmoxVMUuidHelper
Included in:
Proxmox
Defined in:
app/models/foreman_fog_proxmox/proxmox_vm_queries.rb

Constant Summary

Constants included from ProxmoxVMUuidHelper

ProxmoxVMUuidHelper::UUID_REGEXP

Instance Method Summary collapse

Methods included from ProxmoxVMUuidHelper

#extract, #extract_vmid, #match_uuid?

Methods included from ProxmoxPools

#add_vm_to_pool, #pool_owner, #pools, #remove_vm_from_pool, #update_pool

Instance Method Details

#bridges(node_id = default_node_id) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
# File 'app/models/foreman_fog_proxmox/proxmox_vm_queries.rb', line 50

def bridges(node_id = default_node_id)
  cached_bridges = cache.cache(:"bridges-#{node_id}") do
    node = network_client.nodes.get node_id
    node ||= network_client.nodes.first
    bridges = node.networks.all(type: 'any_bridge')
    bridges.sort_by(&:iface).map do |bridge|
      extract_attributes(bridge, [:iface, :node_id]).merge(identity: bridge.iface)
    end
  end

  structs_from_cache(cached_bridges)
end

#find_vm_by_uuid(uuid) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'app/models/foreman_fog_proxmox/proxmox_vm_queries.rb', line 76

def find_vm_by_uuid(uuid)
  # look for the uuid on all known nodes
  vm = nil
  vmid = extract_vmid(uuid)
  fog_nodes.each do |node|
    vm = find_vm_in_servers_by_vmid(node.servers, vmid)
    vm ||= find_vm_in_servers_by_vmid(node.containers, vmid)
    next if vm.nil?
    logger.debug("found vm #{vmid} on node #{node.node}")
    break
  end
  vm
end

#find_vm_in_servers_by_vmid(servers, vmid) ⇒ Object



90
91
92
93
94
95
96
97
98
99
# File 'app/models/foreman_fog_proxmox/proxmox_vm_queries.rb', line 90

def find_vm_in_servers_by_vmid(servers, vmid)
  vm = servers.get(vmid) unless ForemanFogProxmox::Value.empty?(vmid)
  pool_owner(vm) if vm
  attach_compute_resource_id(vm)
rescue Fog::Errors::NotFound
  nil
rescue StandardError => e
  Foreman::Logging.exception(format(_('Failed retrieving proxmox server vm by vmid=%<vmid>s'), vmid: vmid), e)
  raise(ActiveRecord::RecordNotFound, e)
end

#nodesObject



25
26
27
28
29
30
31
32
33
34
# File 'app/models/foreman_fog_proxmox/proxmox_vm_queries.rb', line 25

def nodes
  cached_nodes = cache.cache(:nodes) do
    nodes = client.nodes.all if client
    nodes&.sort_by(&:node)&.map do |node|
      { node: node.node }
    end
  end

  structs_from_cache(cached_nodes)
end

#storages(node_id = default_node_id, type = 'images') ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'app/models/foreman_fog_proxmox/proxmox_vm_queries.rb', line 36

def storages(node_id = default_node_id, type = 'images')
  cached_storages = cache.cache(:"storages-#{node_id}-#{type}") do
    node = client.nodes.get(node_id) || default_node
    storages = node.storages.list_by_content_type type
    logger.debug("storages(): node_id #{node_id} type #{type}")
    storages.reject { |s| s.enabled.to_i.zero? || s.active.to_i.zero? }.sort_by(&:storage).map do |storage|
      fields = [:storage, :enabled, :active, :content, :node_id, :avail, :used, :total]
      extract_attributes(storage, fields).merge(identity: storage.storage)
    end
  end

  structs_from_cache(cached_storages)
end

#vms(opts = {}) ⇒ Object

TODO: Pagination with filters



64
65
66
67
68
69
70
71
72
73
74
# File 'app/models/foreman_fog_proxmox/proxmox_vm_queries.rb', line 64

def vms(opts = {})
  vms = []
  fog_nodes.each { |node| vms += node.servers.all + node.containers.all }
  vms.each { |vm| attach_compute_resource_id(vm) }
  if opts.key?(:eager_loading) && opts[:eager_loading]
    vms_eager = []
    vms.each { |vm| vms_eager << attach_compute_resource_id(vm.collection.get(vm.identity)) }
    vms = vms_eager
  end
  ForemanFogProxmox::Vms.new(vms)
end