From af72715bd36da7a57acdbf033f835a0d9a19fe67 Mon Sep 17 00:00:00 2001 From: Yan Ning Date: Mon, 1 Jun 2015 14:48:23 -0600 Subject: [PATCH] Add validate monasca service to authenticate.py * enable monascaclient call in Rally infra only in this patch Co-Authored-By: Kun Huang Change-Id: Ib97831f025bdf87ee7504211f26d067b982c507a --- rally/consts.py | 3 +++ .../scenarios/authenticate/authenticate.py | 18 ++++++++++++++++ tests/unit/fakes.py | 21 ++++++++++++++++++- .../authenticate/test_authenticate.py | 8 +++++++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/rally/consts.py b/rally/consts.py index 826146f0..e2359546 100644 --- a/rally/consts.py +++ b/rally/consts.py @@ -104,6 +104,7 @@ class _Service(utils.ImmutableMixin, utils.EnumMixin): NEUTRON = "neutron" DESIGNATE = "designate" CEILOMETER = "ceilometer" + MONASCA = "monasca" S3 = "s3" TROVE = "trove" SAHARA = "sahara" @@ -130,6 +131,7 @@ class _ServiceType(utils.ImmutableMixin, utils.EnumMixin): NETWORK = "network" DNS = "dns" METERING = "metering" + MONITORING = "monitoring" S3 = "s3" DATABASE = "database" DATA_PROCESSING = "data_processing" @@ -154,6 +156,7 @@ class _ServiceType(utils.ImmutableMixin, utils.EnumMixin): self.NETWORK: _Service.NEUTRON, self.DNS: _Service.DESIGNATE, self.METERING: _Service.CEILOMETER, + self.MONITORING: _Service.MONASCA, self.S3: _Service.S3, self.DATABASE: _Service.TROVE, self.DATA_PROCESSING: _Service.SAHARA, diff --git a/rally/plugins/openstack/scenarios/authenticate/authenticate.py b/rally/plugins/openstack/scenarios/authenticate/authenticate.py index a5567304..2e2866a0 100644 --- a/rally/plugins/openstack/scenarios/authenticate/authenticate.py +++ b/rally/plugins/openstack/scenarios/authenticate/authenticate.py @@ -12,6 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. +from rally import consts from rally.plugins.openstack import scenario from rally.task import atomic from rally.task import validation @@ -111,3 +112,20 @@ class Authenticate(scenario.OpenStackScenario): for i in range(repetitions): with atomic.ActionTimer(self, "authenticate.validate_heat"): list(heat_client.stacks.list(limit=0)) + + @validation.number("repetitions", minval=1) + @validation.required_openstack(users=True) + @validation.required_services(consts.Service.MONASCA) + @scenario.configure() + def validate_monasca(self, repetitions): + """Check Monasca Client to ensure validation of token. + + Creation of the client does not ensure validation of the token. + We have to do some minimal operation to make sure token gets validated. + + :param repetitions: number of times to validate + """ + monasca_client = self.clients("monasca") + for i in range(repetitions): + with atomic.ActionTimer(self, "authenticate.validate_monasca"): + list(monasca_client.metrics.list(limit=0)) diff --git a/tests/unit/fakes.py b/tests/unit/fakes.py index b4335e6f..d28c3594 100644 --- a/tests/unit/fakes.py +++ b/tests/unit/fakes.py @@ -768,6 +768,12 @@ class FakeMeterManager(FakeManager): return ["fake-meter"] +class FakeMetricsManager(FakeManager): + + def list(self): + return ["fake-metric"] + + class FakeCeilometerResourceManager(FakeManager): def get(self, resource_id): @@ -916,7 +922,8 @@ class FakeObjectManager(FakeManager): class FakeServiceCatalog(object): def get_endpoints(self): return {"image": [{"publicURL": "http://fake.to"}], - "metering": [{"publicURL": "http://fake.to"}]} + "metering": [{"publicURL": "http://fake.to"}], + "monitoring": [{"publicURL": "http://fake.to"}]} def url_for(self, **kwargs): return "http://fake.to" @@ -1027,6 +1034,12 @@ class FakeCeilometerClient(object): self.query_alarm_history = FakeQueryManager() +class FakeMonascaClient(object): + + def __init__(self): + self.metrics = FakeMetricsManager() + + class FakeNeutronClient(object): def __init__(self, **kwargs): @@ -1453,6 +1466,7 @@ class FakeClients(object): self._mistral = None self._swift = None self._murano = None + self._monasca = None self._ec2 = None self._endpoint = endpoint_ or objects.Endpoint( "http://fake.example.org:5000/v2.0/", @@ -1508,6 +1522,11 @@ class FakeClients(object): self._ceilometer = FakeCeilometerClient() return self._ceilometer + def monasca(self): + if not self._monasca: + self._monasca = FakeMonascaClient() + return self._monasca + def zaqar(self): if not self._zaqar: self._zaqar = FakeZaqarClient() diff --git a/tests/unit/plugins/openstack/scenarios/authenticate/test_authenticate.py b/tests/unit/plugins/openstack/scenarios/authenticate/test_authenticate.py index 806878b8..5787a09d 100644 --- a/tests/unit/plugins/openstack/scenarios/authenticate/test_authenticate.py +++ b/tests/unit/plugins/openstack/scenarios/authenticate/test_authenticate.py @@ -67,3 +67,11 @@ class AuthenticateTestCase(test.ScenarioTestCase): scenario_inst.validate_heat(5) self.clients("heat").stacks.list.assert_called_with(limit=0) self.assertEqual(self.clients("heat").stacks.list.call_count, 5) + + def test_validate_monasca(self): + scenario_inst = authenticate.Authenticate() + with atomic.ActionTimer(scenario_inst, + "authenticate.validate_monasca"): + scenario_inst.validate_monasca(5) + self.clients("monasca").metrics.list.assert_called_with(limit=0) + self.assertEqual(self.clients("monasca").metrics.list.call_count, 5)