Add validate monasca service to authenticate.py

* enable monascaclient call in Rally infra only in this patch

Co-Authored-By: Kun Huang <gareth@openstacker.org>
Change-Id: Ib97831f025bdf87ee7504211f26d067b982c507a
This commit is contained in:
Yan Ning 2015-06-01 14:48:23 -06:00 committed by ningyan
parent 30add36a05
commit bdee91bd27
9 changed files with 131 additions and 2 deletions

View File

@ -1,3 +1,4 @@
python-mistralclient
python-fuelclient==6.1.0
python-muranoclient>=0.5.5
python-monascaclient>=1.0.22

View File

@ -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,

View File

@ -282,6 +282,26 @@ class Clients(object):
**self._get_auth_info(project_name_key="tenant_name"))
return client
@cached
def monasca(self, version="2_0"):
"""Return monasca client."""
from monascaclient import client as monasca
kc = self.keystone()
monitoring_api_url = kc.service_catalog.url_for(
service_type="monitoring",
endpoint_type=self.endpoint.endpoint_type,
region_name=self.endpoint.region_name)
auth_token = kc.auth_token
client = monasca.Client(
version,
monitoring_api_url,
token=auth_token,
timeout=CONF.openstack_client_http_timeout,
insecure=self.endpoint.insecure,
cacert=self.endpoint.cacert,
**self._get_auth_info(project_name_key="tenant_name"))
return client
@cached
def ironic(self, version="1"):
"""Return Ironic client."""

View File

@ -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))

View File

@ -0,0 +1,20 @@
{
"Authenticate.validate_monasca": [
{
"args": {
"repetitions": 2
},
"runner": {
"type": "constant",
"times": 10,
"concurrency": 5
},
"context": {
"users": {
"tenants": 3,
"users_per_tenant": 5
}
}
}
]
}

View File

@ -0,0 +1,13 @@
---
Authenticate.validate_monasca:
-
args:
repetitions: 2
runner:
type: "constant"
times: 10
concurrency: 5
context:
users:
tenants: 3
users_per_tenant: 5

View File

@ -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()

View File

@ -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)

View File

@ -13,7 +13,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from keystoneclient import exceptions as keystone_exceptions
import mock
from oslo_config import cfg
@ -326,6 +325,34 @@ class OSClientsTestCase(test.TestCase):
self.assertEqual(fake_ceilometer,
self.clients.cache["ceilometer"])
def test_monasca(self):
fake_monasca = fakes.FakeMonascaClient()
mock_monasca = mock.MagicMock()
mock_monasca.client.Client.return_value = fake_monasca
self.assertNotIn("monasca", self.clients.cache)
with mock.patch.dict("sys.modules",
{"monascaclient": mock_monasca}):
client = self.clients.monasca()
self.assertEqual(fake_monasca, client)
self.service_catalog.url_for.assert_called_once_with(
service_type="monitoring",
endpoint_type=consts.EndpointType.PUBLIC,
region_name=self.endpoint.region_name)
os_endpoint = self.service_catalog.url_for.return_value
kw = {"token": self.fake_keystone.auth_token,
"timeout": cfg.CONF.openstack_client_http_timeout,
"insecure": False, "cacert": None,
"username": self.endpoint.username,
"password": self.endpoint.password,
"tenant_name": self.endpoint.tenant_name,
"auth_url": self.endpoint.auth_url
}
mock_monasca.client.Client.assert_called_once_with("2_0",
os_endpoint,
**kw)
self.assertEqual(mock_monasca.client.Client.return_value,
self.clients.cache["monasca"])
def test_ironic(self):
fake_ironic = fakes.FakeIronicClient()
mock_ironic = mock.MagicMock()