ManageIQ/manageiq-content

View on GitHub
content/automate/ManageIQ/System/CommonMethods/QuotaMethods.class/__methods__/used.rb

Summary

Maintainability
A
2 hrs
Test Coverage
A
100%
# frozen_string_literal: true

#
# Description: calculate entity used quota values
#

module ManageIQ
  module Automate
    module System
      module CommonMethods
        module QuotaMethods
          class Used
            def initialize(handle = $evm)
              @handle = handle
            end

            def main
              used(quota_source)
            end

            private

            def used(quota_source)
              quota_used = consumption(quota_source)
              @handle.log("info", "Quota Used: (:cpu=>#{quota_used[:cpu]}, :memory=>#{quota_used[:memory]} (#{quota_used[:memory].to_s(:human_size)}), :vms=>#{quota_used[:vms]}, storage=>#{quota_used[:storage]} (#{quota_used[:storage].to_s(:human_size)}), provisioned_storage=>#{quota_used[:provisioned_storage]} (#{quota_used[:provisioned_storage].to_s(:human_size)}))")

              quota_source_type = root_quota_source_type
              @handle.log("info", "Quota source type: #{quota_source_type}")

              validate_user_email if quota_source_type == 'user'
              quota_active = active_provision_counts(quota_source_type)
              @handle.log("info", "Quota #{active_method_name(quota_source_type)}: (:cpu=>#{quota_active[:cpu]}, :memory=>#{quota_active[:memory]} (#{quota_active[:memory].to_s(:human_size)}), :vms=>#{quota_active[:vms]}, storage=>#{quota_active[:storage]} (#{quota_active[:storage].to_s(:human_size)}))")

              merge_counts(quota_used, quota_active)
            end

            def quota_source
              raise "ERROR - quota_source not found" unless @handle.root['quota_source']
              @handle.root['quota_source']
            end

            def root_quota_source_type
              raise "ERROR - quota_source_type not found" unless @handle.root['quota_source_type']
              @handle.root['quota_source_type'].downcase
            end

            def consumption(source)
              {
                :cpu                 => source.allocated_vcpu,
                :memory              => source.allocated_memory,
                :vms                 => source.vms.count { |vm| vm.id if vm.ems_id },
                :storage             => source.allocated_storage,
                :provisioned_storage => source.provisioned_storage
              }
            end

            def active_method_name(quota_source_type)
              source = quota_source_type == 'user' ? 'owner' : quota_source_type
              "active_provisions_by_#{source}".to_sym
            end

            def validate_user_email
              email = @handle.root['miq_request'].get_option(:owner_email) || @handle.root['miq_request'].requester.email
              return if email.present?
              @handle.log(:error, "Owner email not specified for User Quota")
              raise "ERROR - Owner email not specified for User Quota"
            end

            def active_provision_counts(quota_source_type)
              active_provisions = @handle.root['miq_request'].check_quota(active_method_name(quota_source_type))
              {:cpu                 => active_provisions[:cpu],
               :memory              => active_provisions[:memory],
               :vms                 => active_provisions[:count],
               :storage             => active_provisions[:storage],
               :provisioned_storage => 0}
            end

            def merge_counts(quota_used, quota_active)
              @handle.root['quota_used'] = quota_used.merge(quota_active) { |_key, val1, val2| val1 + val2 }
              @handle.log("info", "Quota Totals: (:cpu=>#{quota_used[:cpu]}, :memory=>#{quota_used[:memory]} (#{quota_used[:memory].to_s(:human_size)}), :vms=>#{quota_used[:vms]}, storage=>#{quota_used[:storage]} (#{quota_used[:storage].to_s(:human_size)}), provisioned_storage=>#{quota_used[:provisioned_storage]} (#{quota_used[:provisioned_storage].to_s(:human_size)}))")
            end
          end
        end
      end
    end
  end
end

ManageIQ::Automate::System::CommonMethods::QuotaMethods::Used.new.main