Merge "add unit column for metric"
This commit is contained in:
commit
8381f9444f
@ -320,7 +320,8 @@ class IndexerDriver(object):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def create_metric(id, created_by_user_id, created_by_project_id,
|
def create_metric(id, created_by_user_id, created_by_project_id,
|
||||||
archive_policy_name, name=None, resource_id=None):
|
archive_policy_name, name=None, unit=None,
|
||||||
|
resource_id=None):
|
||||||
raise exceptions.NotImplementedError
|
raise exceptions.NotImplementedError
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -0,0 +1,38 @@
|
|||||||
|
# Copyright 2016 OpenStack Foundation
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
"""add unit column for metric
|
||||||
|
|
||||||
|
Revision ID: c62df18bf4ee
|
||||||
|
Revises: 2e0b912062d1
|
||||||
|
Create Date: 2016-05-04 12:31:25.350190
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = 'c62df18bf4ee'
|
||||||
|
down_revision = '2e0b912062d1'
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
op.add_column('metric', sa.Column('unit',
|
||||||
|
sa.String(length=31),
|
||||||
|
nullable=True))
|
@ -414,12 +414,13 @@ class SQLAlchemyIndexer(indexer.IndexerDriver):
|
|||||||
@retry_on_deadlock
|
@retry_on_deadlock
|
||||||
def create_metric(self, id, created_by_user_id, created_by_project_id,
|
def create_metric(self, id, created_by_user_id, created_by_project_id,
|
||||||
archive_policy_name,
|
archive_policy_name,
|
||||||
name=None, resource_id=None):
|
name=None, unit=None, resource_id=None):
|
||||||
m = Metric(id=id,
|
m = Metric(id=id,
|
||||||
created_by_user_id=created_by_user_id,
|
created_by_user_id=created_by_user_id,
|
||||||
created_by_project_id=created_by_project_id,
|
created_by_project_id=created_by_project_id,
|
||||||
archive_policy_name=archive_policy_name,
|
archive_policy_name=archive_policy_name,
|
||||||
name=name,
|
name=name,
|
||||||
|
unit=unit,
|
||||||
resource_id=resource_id)
|
resource_id=resource_id)
|
||||||
try:
|
try:
|
||||||
with self.facade.writer() as session:
|
with self.facade.writer() as session:
|
||||||
@ -581,12 +582,14 @@ class SQLAlchemyIndexer(indexer.IndexerDriver):
|
|||||||
if update == 0:
|
if update == 0:
|
||||||
raise indexer.NoSuchMetric(value)
|
raise indexer.NoSuchMetric(value)
|
||||||
else:
|
else:
|
||||||
|
unit = value.get('unit')
|
||||||
ap_name = value['archive_policy_name']
|
ap_name = value['archive_policy_name']
|
||||||
m = Metric(id=uuid.uuid4(),
|
m = Metric(id=uuid.uuid4(),
|
||||||
created_by_user_id=r.created_by_user_id,
|
created_by_user_id=r.created_by_user_id,
|
||||||
created_by_project_id=r.created_by_project_id,
|
created_by_project_id=r.created_by_project_id,
|
||||||
archive_policy_name=ap_name,
|
archive_policy_name=ap_name,
|
||||||
name=name,
|
name=name,
|
||||||
|
unit=unit,
|
||||||
resource_id=r.id)
|
resource_id=r.id)
|
||||||
session.add(m)
|
session.add(m)
|
||||||
try:
|
try:
|
||||||
|
@ -159,6 +159,7 @@ class Metric(Base, GnocchiBase, storage.Metric):
|
|||||||
ondelete="SET NULL",
|
ondelete="SET NULL",
|
||||||
name="fk_metric_resource_id_resource_id"))
|
name="fk_metric_resource_id_resource_id"))
|
||||||
name = sqlalchemy.Column(sqlalchemy.String(255))
|
name = sqlalchemy.Column(sqlalchemy.String(255))
|
||||||
|
unit = sqlalchemy.Column(sqlalchemy.String(31))
|
||||||
status = sqlalchemy.Column(sqlalchemy.Enum('active', 'delete',
|
status = sqlalchemy.Column(sqlalchemy.Enum('active', 'delete',
|
||||||
name="metric_status_enum"),
|
name="metric_status_enum"),
|
||||||
nullable=False,
|
nullable=False,
|
||||||
@ -170,6 +171,7 @@ class Metric(Base, GnocchiBase, storage.Metric):
|
|||||||
"created_by_user_id": self.created_by_user_id,
|
"created_by_user_id": self.created_by_user_id,
|
||||||
"created_by_project_id": self.created_by_project_id,
|
"created_by_project_id": self.created_by_project_id,
|
||||||
"name": self.name,
|
"name": self.name,
|
||||||
|
"unit": self.unit,
|
||||||
}
|
}
|
||||||
unloaded = sqlalchemy.inspect(self).unloaded
|
unloaded = sqlalchemy.inspect(self).unloaded
|
||||||
if 'resource' in unloaded:
|
if 'resource' in unloaded:
|
||||||
@ -193,6 +195,7 @@ class Metric(Base, GnocchiBase, storage.Metric):
|
|||||||
and self.created_by_user_id == other.created_by_user_id
|
and self.created_by_user_id == other.created_by_user_id
|
||||||
and self.created_by_project_id == other.created_by_project_id
|
and self.created_by_project_id == other.created_by_project_id
|
||||||
and self.name == other.name
|
and self.name == other.name
|
||||||
|
and self.unit == other.unit
|
||||||
and self.resource_id == other.resource_id)
|
and self.resource_id == other.resource_id)
|
||||||
or (storage.Metric.__eq__(self, other)))
|
or (storage.Metric.__eq__(self, other)))
|
||||||
|
|
||||||
|
@ -613,6 +613,8 @@ class MetricsController(rest.RestController):
|
|||||||
"project_id": six.text_type,
|
"project_id": six.text_type,
|
||||||
"archive_policy_name": six.text_type,
|
"archive_policy_name": six.text_type,
|
||||||
"name": six.text_type,
|
"name": six.text_type,
|
||||||
|
voluptuous.Optional("unit"):
|
||||||
|
voluptuous.All(six.text_type, voluptuous.Length(max=31)),
|
||||||
})
|
})
|
||||||
|
|
||||||
# NOTE(jd) Define this method as it was a voluptuous schema – it's just a
|
# NOTE(jd) Define this method as it was a voluptuous schema – it's just a
|
||||||
@ -648,6 +650,7 @@ class MetricsController(rest.RestController):
|
|||||||
"project_id": definition.get('project_id'),
|
"project_id": definition.get('project_id'),
|
||||||
"archive_policy_name": archive_policy_name,
|
"archive_policy_name": archive_policy_name,
|
||||||
"name": name,
|
"name": name,
|
||||||
|
"unit": definition.get('unit'),
|
||||||
})
|
})
|
||||||
|
|
||||||
return definition
|
return definition
|
||||||
@ -661,6 +664,7 @@ class MetricsController(rest.RestController):
|
|||||||
uuid.uuid4(),
|
uuid.uuid4(),
|
||||||
user, project,
|
user, project,
|
||||||
name=body.get('name'),
|
name=body.get('name'),
|
||||||
|
unit=body.get('unit'),
|
||||||
archive_policy_name=body['archive_policy_name'])
|
archive_policy_name=body['archive_policy_name'])
|
||||||
except indexer.NoSuchArchivePolicy as e:
|
except indexer.NoSuchArchivePolicy as e:
|
||||||
abort(400, e)
|
abort(400, e)
|
||||||
|
@ -63,17 +63,33 @@ tests:
|
|||||||
response_strings:
|
response_strings:
|
||||||
- "[]"
|
- "[]"
|
||||||
|
|
||||||
- name: create metric with name
|
- name: create metric with name and unit
|
||||||
url: /v1/metric
|
url: /v1/metric
|
||||||
request_headers:
|
request_headers:
|
||||||
content-type: application/json
|
content-type: application/json
|
||||||
method: post
|
method: post
|
||||||
data:
|
data:
|
||||||
name: "disk.io.rate"
|
name: "disk.io.rate"
|
||||||
|
unit: "B/s"
|
||||||
status: 201
|
status: 201
|
||||||
response_json_paths:
|
response_json_paths:
|
||||||
$.archive_policy_name: cookies
|
$.archive_policy_name: cookies
|
||||||
$.name: disk.io.rate
|
$.name: disk.io.rate
|
||||||
|
$.unit: B/s
|
||||||
|
|
||||||
|
- name: create metric with name and over length unit
|
||||||
|
url: /v1/metric
|
||||||
|
request_headers:
|
||||||
|
content-type: application/json
|
||||||
|
method: post
|
||||||
|
data:
|
||||||
|
name: "disk.io.rate"
|
||||||
|
unit: "over_length_unit_over_length_unit"
|
||||||
|
status: 400
|
||||||
|
response_strings:
|
||||||
|
# split to not match the u' in py2
|
||||||
|
- "Invalid input: length of value must be at most 31 for dictionary value @ data["
|
||||||
|
- "'unit']"
|
||||||
|
|
||||||
- name: create metric with name no rule
|
- name: create metric with name no rule
|
||||||
url: /v1/metric
|
url: /v1/metric
|
||||||
|
@ -148,6 +148,7 @@ class TestIndexerDriver(tests_base.TestCase):
|
|||||||
self.assertEqual(m.created_by_user_id, user)
|
self.assertEqual(m.created_by_user_id, user)
|
||||||
self.assertEqual(m.created_by_project_id, project)
|
self.assertEqual(m.created_by_project_id, project)
|
||||||
self.assertIsNone(m.name)
|
self.assertIsNone(m.name)
|
||||||
|
self.assertIsNone(m.unit)
|
||||||
self.assertIsNone(m.resource_id)
|
self.assertIsNone(m.resource_id)
|
||||||
m2 = self.index.list_metrics(id=r1)
|
m2 = self.index.list_metrics(id=r1)
|
||||||
self.assertEqual([m], m2)
|
self.assertEqual([m], m2)
|
||||||
|
Loading…
Reference in New Issue
Block a user