From 0075717612533dae29ceb531741ef93c2131fc67 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Wed, 14 Dec 2022 10:48:40 +0530 Subject: [PATCH] api: fix listVirtuaMachinesMetrics API for user (#6985) Fixes #6983 In case of multiple classes for and API class, ApiServer returns an API command class for User role only when ResponseView is set to Restricted in annotation. This PR set Restricted ResponseView for ListVMsMetrics class. It also adds a smoke test for User role account for the listVirtualMachinesMetrics API. Signed-off-by: Abhishek Kumar --- .../cloudstack/api/ListVMsMetricsCmd.java | 2 +- test/integration/smoke/test_metrics_api.py | 44 +++++++++++++------ 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListVMsMetricsCmd.java b/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListVMsMetricsCmd.java index 38001cedb09..55af69e623c 100644 --- a/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListVMsMetricsCmd.java +++ b/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListVMsMetricsCmd.java @@ -43,7 +43,7 @@ import org.apache.cloudstack.response.VmMetricsResponse; * */ @APICommand(name = ListVMsMetricsCmd.APINAME, description = "Lists VM metrics", responseObject = VmMetricsResponse.class, - requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, responseView = ResponseObject.ResponseView.Full, + requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, responseView = ResponseObject.ResponseView.Restricted, since = "4.9.3", authorized = {RoleType.ResourceAdmin, RoleType.DomainAdmin, RoleType.User}) public class ListVMsMetricsCmd extends ListVMsCmd implements UserCmd { public static final String APINAME = "listVirtualMachinesMetrics"; diff --git a/test/integration/smoke/test_metrics_api.py b/test/integration/smoke/test_metrics_api.py index e870dadee83..3ff602c1a71 100644 --- a/test/integration/smoke/test_metrics_api.py +++ b/test/integration/smoke/test_metrics_api.py @@ -58,16 +58,28 @@ class TestMetrics(cloudstackTestCase): cls.hypervisor ) cls._cleanup.append(cls.service_offering) + cls.domain = get_domain(cls.apiclient) + cls.account = Account.create( + cls.apiclient, + cls.services["account"], + admin=False, + domainid=cls.domain.id + ) + cls._cleanup.append(cls.account) @classmethod def tearDownClass(cls): super(TestMetrics, cls).tearDownClass() def setUp(self): + self.userapiclient = self.testClient.getUserApiClient( + UserName=self.account.name, + DomainName=self.account.domain + ) self.cleanup = [] def tearDown(self): - super(TestMetrics, self).tearDown(); + super(TestMetrics, self).tearDown() @attr(tags = ["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_list_hosts_metrics(self): @@ -117,23 +129,24 @@ class TestMetrics(cloudstackTestCase): return - @attr(tags = ["advanced", "advancedns", "smoke", "basic"], required_hardware="false") - def test_list_vms_metrics(self): - #deploy VM + def run_list_vm_metrics_test(self, is_user): + apiclient = self.apiclient + if is_user: + apiclient = self.userapiclient self.small_virtual_machine = VirtualMachine.create( - self.apiclient, - self.services["virtual_machine"], - serviceofferingid=self.service_offering.id, - templateid=self.template.id, - zoneid=self.zone.id - ) + apiclient, + self.services["virtual_machine"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + zoneid=self.zone.id + ) self.cleanup.append(self.small_virtual_machine) cmd = listVirtualMachinesMetrics.listVirtualMachinesMetricsCmd() cmd.id = self.small_virtual_machine.id - lvmm = self.apiclient.listVirtualMachinesMetrics(cmd)[0] + lvmm = apiclient.listVirtualMachinesMetrics(cmd)[0] self.assertEqual(lvmm.id, self.small_virtual_machine.id) @@ -144,7 +157,13 @@ class TestMetrics(cloudstackTestCase): self.assertTrue(hasattr(lvmm, 'networkread')) self.assertTrue(hasattr(lvmm, 'networkwrite')) - return + @attr(tags = ["advanced", "advancedns", "smoke", "basic"], required_hardware="false") + def test_list_vms_metrics_admin(self): + self.run_list_vm_metrics_test(False) + + @attr(tags = ["advanced", "advancedns", "smoke", "basic"], required_hardware="false") + def test_list_vms_metrics_user(self): + self.run_list_vm_metrics_test(True) @attr(tags = ["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_list_pstorage_metrics(self): @@ -376,4 +395,3 @@ class TestMetrics(cloudstackTestCase): return True except ValueError: return False -