Merge "Fix list metric for other tenants"

This commit is contained in:
Jenkins 2017-01-13 00:05:10 +00:00 committed by Gerrit Code Review
commit 2e186162cd
5 changed files with 72 additions and 8 deletions

View File

@ -107,6 +107,8 @@ middleware:
defaultAuthorizedRoles: [user, domainuser, domainadmin, monasca-user, admin]
readOnlyAuthorizedRoles: [monasca-read-only-user]
agentAuthorizedRoles: [monasca-agent]
delegateAuthorizedRole: admin
adminRole: admin
adminAuthMethod: password
adminUser: "admin"
adminPassword: "secretadmin"

View File

@ -131,6 +131,9 @@ class Metrics(metrics_api_v2.MetricsV2API):
def on_get(self, req, res):
helpers.validate_authorization(req, self._get_metrics_authorized_roles)
tenant_id = (
helpers.get_x_tenant_or_tenant_id(req,
self._delegate_authorized_roles))
name = helpers.get_query_name(req)
helpers.validate_query_name(name)
dimensions = helpers.get_query_dimensions(req)
@ -139,7 +142,7 @@ class Metrics(metrics_api_v2.MetricsV2API):
start_timestamp = helpers.get_query_starttime_timestamp(req, False)
end_timestamp = helpers.get_query_endtime_timestamp(req, False)
helpers.validate_start_end_timestamps(start_timestamp, end_timestamp)
result = self._list_metrics(req.project_id, name,
result = self._list_metrics(tenant_id, name,
dimensions, req.uri,
offset, req.limit,
start_timestamp, end_timestamp)
@ -170,6 +173,9 @@ class MetricsMeasurements(metrics_api_v2.MetricsMeasurementsV2API):
def on_get(self, req, res):
helpers.validate_authorization(req, self._get_metrics_authorized_roles)
tenant_id = (
helpers.get_x_tenant_or_tenant_id(req,
self._delegate_authorized_roles))
name = helpers.get_query_name(req, True)
helpers.validate_query_name(name)
dimensions = helpers.get_query_dimensions(req)
@ -181,7 +187,7 @@ class MetricsMeasurements(metrics_api_v2.MetricsMeasurementsV2API):
merge_metrics_flag = get_merge_metrics_flag(req)
group_by = helpers.get_query_group_by(req)
result = self._measurement_list(req.project_id, name, dimensions,
result = self._measurement_list(tenant_id, name, dimensions,
start_timestamp, end_timestamp,
req.uri, offset,
req.limit, merge_metrics_flag,
@ -214,6 +220,8 @@ class MetricsStatistics(metrics_api_v2.MetricsStatisticsV2API):
try:
super(MetricsStatistics, self).__init__()
self._region = cfg.CONF.region
self._delegate_authorized_roles = (
cfg.CONF.security.delegate_authorized_roles)
self._get_metrics_authorized_roles = (
cfg.CONF.security.default_authorized_roles +
cfg.CONF.security.read_only_authorized_roles)
@ -227,6 +235,9 @@ class MetricsStatistics(metrics_api_v2.MetricsStatisticsV2API):
def on_get(self, req, res):
helpers.validate_authorization(req, self._get_metrics_authorized_roles)
tenant_id = (
helpers.get_x_tenant_or_tenant_id(req,
self._delegate_authorized_roles))
name = helpers.get_query_name(req, True)
helpers.validate_query_name(name)
dimensions = helpers.get_query_dimensions(req)
@ -240,7 +251,7 @@ class MetricsStatistics(metrics_api_v2.MetricsStatisticsV2API):
merge_metrics_flag = get_merge_metrics_flag(req)
group_by = helpers.get_query_group_by(req)
result = self._metric_statistics(req.project_id, name, dimensions,
result = self._metric_statistics(tenant_id, name, dimensions,
start_timestamp, end_timestamp,
statistics, period, req.uri,
offset, req.limit, merge_metrics_flag,
@ -274,6 +285,8 @@ class MetricsNames(metrics_api_v2.MetricsNamesV2API):
try:
super(MetricsNames, self).__init__()
self._region = cfg.CONF.region
self._delegate_authorized_roles = (
cfg.CONF.security.delegate_authorized_roles)
self._get_metrics_authorized_roles = (
cfg.CONF.security.default_authorized_roles +
cfg.CONF.security.read_only_authorized_roles)
@ -287,10 +300,13 @@ class MetricsNames(metrics_api_v2.MetricsNamesV2API):
def on_get(self, req, res):
helpers.validate_authorization(req, self._get_metrics_authorized_roles)
tenant_id = (
helpers.get_x_tenant_or_tenant_id(req,
self._delegate_authorized_roles))
dimensions = helpers.get_query_dimensions(req)
helpers.validate_query_dimensions(dimensions)
offset = helpers.get_query_param(req, 'offset')
result = self._list_metric_names(req.project_id, dimensions,
result = self._list_metric_names(tenant_id, dimensions,
req.uri, offset, req.limit)
res.body = helpers.dumpit_utf8(result)
res.status = falcon.HTTP_200
@ -311,6 +327,8 @@ class DimensionValues(metrics_api_v2.DimensionValuesV2API):
try:
super(DimensionValues, self).__init__()
self._region = cfg.CONF.region
self._delegate_authorized_roles = (
cfg.CONF.security.delegate_authorized_roles)
self._get_metrics_authorized_roles = (
cfg.CONF.security.default_authorized_roles +
cfg.CONF.security.read_only_authorized_roles)
@ -324,11 +342,14 @@ class DimensionValues(metrics_api_v2.DimensionValuesV2API):
def on_get(self, req, res):
helpers.validate_authorization(req, self._get_metrics_authorized_roles)
tenant_id = (
helpers.get_x_tenant_or_tenant_id(req,
self._delegate_authorized_roles))
metric_name = helpers.get_query_param(req, 'metric_name')
dimension_name = helpers.get_query_param(req, 'dimension_name',
required=True)
offset = helpers.get_query_param(req, 'offset')
result = self._dimension_values(req.project_id, req.uri, metric_name,
result = self._dimension_values(tenant_id, req.uri, metric_name,
dimension_name, offset, req.limit)
res.body = helpers.dumpit_utf8(result)
res.status = falcon.HTTP_200
@ -350,6 +371,8 @@ class DimensionNames(metrics_api_v2.DimensionNamesV2API):
try:
super(DimensionNames, self).__init__()
self._region = cfg.CONF.region
self._delegate_authorized_roles = (
cfg.CONF.security.delegate_authorized_roles)
self._get_metrics_authorized_roles = (
cfg.CONF.security.default_authorized_roles +
cfg.CONF.security.read_only_authorized_roles)
@ -363,9 +386,12 @@ class DimensionNames(metrics_api_v2.DimensionNamesV2API):
def on_get(self, req, res):
helpers.validate_authorization(req, self._get_metrics_authorized_roles)
tenant_id = (
helpers.get_x_tenant_or_tenant_id(req,
self._delegate_authorized_roles))
metric_name = helpers.get_query_param(req, 'metric_name')
offset = helpers.get_query_param(req, 'offset')
result = self._dimension_names(req.project_id, req.uri, metric_name,
result = self._dimension_names(tenant_id, req.uri, metric_name,
offset, req.limit)
res.body = helpers.dumpit_utf8(result)
res.status = falcon.HTTP_200

View File

@ -32,8 +32,10 @@ class MonascaClient(rest_client.RestClient):
resp, response_body = self.get('')
return resp, response_body
def create_metrics(self, metrics):
def create_metrics(self, metrics, tenant_id=None):
uri = 'metrics'
if tenant_id:
uri = uri + '?tenant_id=%s' % tenant_id
request_body = json.dumps(metrics)
resp, response_body = self.post(uri, request_body)
return resp, response_body

View File

@ -39,9 +39,10 @@ class BaseMonascaTest(tempest.test.BaseTestCase):
force_tenant_isolation=True,
identity_version=auth_version)
credentials = cls.cred_provider.get_creds_by_roles(
['monasca-user', 'anotherrole']).credentials
['monasca-user', 'anotherrole', 'admin']).credentials
cls.os = clients.Manager(credentials=credentials)
cls.monasca_client = cls.os.monasca_client
cls.tenants_client = cls.os.tenants_client
@staticmethod
def cleanup_resources(method, list_of_ids):

View File

@ -15,6 +15,7 @@
# TODO(RMH): Check if ' should be added in the list of INVALID_CHARS.
# TODO(RMH): test_create_metric_no_value, should return 422 if value not sent
import time
from six.moves import range as xrange
from monasca_tempest_tests.tests.api import base
from monasca_tempest_tests.tests.api import constants
@ -413,6 +414,38 @@ class TestMetrics(base.BaseMonascaTest):
"metrics = 0"
self.fail(error_msg)
@test.attr(type='gate')
def test_list_metrics_with_tenant(self):
name = data_utils.rand_name('name')
key = data_utils.rand_name('key')
value = data_utils.rand_name('value')
tenant = self.tenants_client.create_tenant(
name=data_utils.rand_name('test_tenant'))['tenant']
# Delete the tenant at the end of the test
self.addCleanup(self.tenants_client.delete_tenant, tenant['id'])
metric = helpers.create_metric(name=name,
dimensions={key: value})
resp, response_body = self.monasca_client.create_metrics(
metric, tenant_id=tenant['id'])
self.assertEqual(204, resp.status)
query_param = '?tenant_id=' + str(tenant['id'])
for i in xrange(constants.MAX_RETRIES):
resp, response_body = self.monasca_client.list_metrics(query_param)
self.assertEqual(200, resp.status)
elements = response_body['elements']
for element in elements:
if str(element['name']) == name:
self._verify_list_metrics_element(element, test_key=key,
test_value=value)
return
time.sleep(constants.RETRY_WAIT_SECS)
if i == constants.MAX_RETRIES - 1:
error_msg = "Failed test_list_metrics_with_tenant: " \
"timeout on waiting for metrics: at least " \
"one metric is needed. Current number of " \
"metrics = 0"
self.fail(error_msg)
@test.attr(type='gate')
def test_list_metrics_with_offset_limit(self):
name = data_utils.rand_name()