fog/fog-vsphere

View on GitHub
lib/fog/vsphere/requests/compute/list_compute_resources.rb

Summary

Maintainability
A
2 hrs
Test Coverage
module Fog
  module Vsphere
    class Compute
      class Real
        def list_compute_resources(filters = {})
          datacenter_name = filters[:datacenter]
          # default to show all compute_resources
          only_active = filters[:effective] || false
          compute_resources = raw_compute_resources datacenter_name

          compute_resources.map do |compute_resource|
            next if compute_resource.instance_of? RbVmomi::VIM::Folder
            summary = compute_resource.summary
            next if only_active && (summary.numEffectiveHosts == 0)
            compute_resource_attributes(compute_resource, datacenter_name)
          end.compact
        end

        def raw_compute_resources(datacenter_name)
          find_raw_datacenter(datacenter_name).find_compute_resource('').children
        end

        protected

        def compute_resource_attributes(compute_resource, _datacenter)
          overall_usage = compute_resource.host.inject(overallCpuUsage: 0, overallMemoryUsage: 0) do |sum, host|
            {
              overallCpuUsage: sum[:overallCpuUsage] + (host.summary.quickStats.overallCpuUsage || 0),
              overallMemoryUsage: sum[:overallMemoryUsage] + (host.summary.quickStats.overallMemoryUsage || 0)
            }
          end
          {
            id: managed_obj_id(compute_resource),
            name: compute_resource.name,
            totalCpu: compute_resource.summary.totalCpu,
            totalMemory: compute_resource.summary.totalMemory,
            numCpuCores: compute_resource.summary.numCpuCores,
            numCpuThreads: compute_resource.summary.numCpuThreads,
            effectiveCpu: compute_resource.summary.effectiveCpu,
            effectiveMemory: compute_resource.summary.effectiveMemory,
            numHosts: compute_resource.summary.numHosts,
            numEffectiveHosts: compute_resource.summary.numEffectiveHosts,
            overallStatus: compute_resource.summary.overallStatus,
            overallCpuUsage: overall_usage[:overallCpuUsage],
            overallMemoryUsage: overall_usage[:overallMemoryUsage],
            effective: compute_resource.summary.numEffectiveHosts > 0,
            isSingleHost: compute_resource.summary.numHosts == 1
          }
        end
      end
      class Mock
        def list_compute_resources(_filters = {})
          [
            {
              id: 'domain-s7',
              name: 'fake-host',
              totalCpu: 33_504,
              totalMemory: 154_604_142_592,
              numCpuCores: 12,
              numCpuThreads: 24,
              effectiveCpu: 32_247,
              effectiveMemory: 135_733,
              numHosts: 1,
              numEffectiveHosts: 1,
              overallStatus: 'gray',
              overallCpuUsage: 15_682,
              overallMemoryUsage: 132_755,
              effective: true,
              isSingleHost: true
            }, {
              id: 'domain-s74',
              name: 'fake-cluster',
              totalCpu: 41_484,
              totalMemory: 51_525_996_544,
              numCpuCores: 12,
              numCpuThreads: 24,
              effectiveCpu: 37_796,
              effectiveMemory: 45_115,
              numHosts: 2,
              numEffectiveHosts: 2,
              overallStatus: 'gray',
              overallCpuUsage: 584,
              overallMemoryUsage: 26_422,
              effective: true,
              isSingleHost: false
            }
          ]
        end
      end
    end
  end
end