diff --git a/app/controllers/api/subcollections/metrics.rb b/app/controllers/api/subcollections/metrics.rb new file mode 100644 index 0000000000..eb45721d99 --- /dev/null +++ b/app/controllers/api/subcollections/metrics.rb @@ -0,0 +1,17 @@ +module Api + module Subcollections + module Metrics + RESOURCE_TYPES = { + 'vms' => 'VmOrTemplate' + }.freeze + + def metrics_query_resource(object) + params[:resource_type] = RESOURCE_TYPES[@req.collection] || object.class.to_s + params[:resource_ids] ||= [object.id] + + metrics_service = MetricsService.new(params) + metrics_service.query_metrics + end + end + end +end diff --git a/app/controllers/api/vms_controller.rb b/app/controllers/api/vms_controller.rb index f5e6398b59..fcb71fa5c8 100644 --- a/app/controllers/api/vms_controller.rb +++ b/app/controllers/api/vms_controller.rb @@ -7,6 +7,7 @@ class VmsController < BaseController include Subcollections::Compliances include Subcollections::CustomAttributes include Subcollections::Disks + include Subcollections::Metrics include Subcollections::MetricRollups include Subcollections::Policies include Subcollections::PolicyProfiles diff --git a/config/api.yml b/config/api.yml index 3e7ff18d5d..8a0c4d4138 100644 --- a/config/api.yml +++ b/config/api.yml @@ -2237,7 +2237,7 @@ :klass: ChargebackRateDetailMeasure :metric_rollups: :description: Metric Rollups - :identifier: metric_rollups + :identifier: metrics :options: - :collection - :subcollection diff --git a/spec/requests/vms_spec.rb b/spec/requests/vms_spec.rb index 91747096ee..058c41eba8 100644 --- a/spec/requests/vms_spec.rb +++ b/spec/requests/vms_spec.rb @@ -2148,6 +2148,37 @@ def query_match_regexp(*tables) end end + describe "metrics subcollection" do + let(:url) { api_vm_metrics_url(nil, vm) } + + before do + FactoryBot.create_list(:metric_vm_rt, 3, :resource => vm) + end + + it 'returns the metrics for the vm' do + api_basic_authorize subcollection_action_identifier(:vms, :metrics, :read, :get) + + get(url, :params => {:start_date => Time.zone.today.to_s}) + + expected = { + 'count' => 3, + 'subcount' => 3, + 'pages' => 1 + } + expect(response).to have_http_status(:ok) + expect(response.parsed_body).to include(expected) + expect(response.parsed_body['links'].keys).to match_array(%w[self first last]) + end + + it 'will not return metrics without an appropriate role' do + api_basic_authorize + + get(url, :params => {:start_date => Time.zone.today.to_s}) + + expect(response).to have_http_status(:forbidden) + end + end + describe "metric rollups subcollection" do let(:url) { api_vm_metric_rollups_url(nil, vm) }